【问题标题】:How can I export the 'result' returned from a mysql query?如何导出从 mysql 查询返回的“结果”?
【发布时间】:2019-05-29 00:18:47
【问题描述】:

我正在尝试使用节点 js 将 MySql 数据最终放置在 HTML(实际上是一个 ejs)页面中。

我一直在使用 W3 的节点 js 示例中的以下代码。 https://www.w3schools.com/nodejs/nodejs_mysql_select.asp

我最终想做的是在“结果”上使用 module.exports,并能够访问另一个文件中的数组。我发现这很难完成。

var mysql = require('mysql');

var con = mysql.createConnection({ 
    host: "localhost",
    user: "username", 
    password: "password", 
    database: "testdb" 
});

con.connect(function(err) {
    if (err) throw err; 
    con.query("SELECT * FROM customers", function (err, result, fields) {
    if (err) throw err; 
    console.log(result); 
});

// This is what is logged to the console.

// [ RowDataPacket { name: 'Company Inc', address: 'Highway 37' }, 
  RowDataPacket { name: 'Sanitation', address: 'Highway 27' }, 
  RowDataPacket { name: 'Ice Cream', address: 'Highway 11' } ]

// Above works but it doesn't do what I need it to. 
// Below is explained what I need to happen.

var mysql = require('mysql');

var x; // x is undefined

var con = mysql.createConnection({ 
    host: "localhost", 
    user: "username", 
    password: "password", 
    database: "testdb" 
});

con.connect(function(err) { 
    if (err) throw err; 
    con.query("SELECT * FROM customers", 
    function (err, result, fields) { 
    if (err) throw err; 
    x = result; // If I do a 'console.log(x);' here I get the array above. 
    // If try to 'module.exports = result;' here, it is 
    // undefined in the receiving file. }); 
});

console.log(x); // x is undefined, even though result was stored in x.

我希望'console.log(x);'在代码的底部返回数组,但它是未定义的。这让我认为“con.query”中的任何内容都是本地的。如果是这样,我考虑使用'module. export = result' 在函数中,但这也会在接收文件中返回一个未定义的变量。如果有人知道为什么会发生这种情况,或者如果有解决方案,我将非常感谢您的建议:)

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

    也许你需要做的是导出你的函数,并在你想要的时候使用它

    我建议你导出数据库连接变量,这样你就可以随时使用它,比如:

    config.js

    var con = mysql.createConnection({ 
        host: "localhost", 
        user: "username", 
        password: "password", 
        database: "testdb" 
    });
    exports.default = con
    

    fileThatUsesResult.js

    const db = ./config.js
    db.con.connect(function(err) { 
        if (err) throw err; 
        con.query("SELECT * FROM customers", 
        function (err, result, fields) { 
        if (err) throw err; 
        //here you use your results, maybe res.json or whatever you want to do
    });
    

    这样,您可以拆分代码并在需要时调用 dabatase 连接对象。记住 DRY 原则。

    顺便说一句,我建议你使用 promise 而不是回调函数,这样你就可以管理你的异步调用

    希望我能帮上忙!

    【讨论】:

    • 感谢您的帮助!我不熟悉 promises,但在研究了它们之后,我认为这就是我应该走的路!
    • 好!如果它有助于将其标记为已回答,请@LoganLuedtke
    【解决方案2】:

    我让它工作了!问题是我的查询是一个异步函数,我希望像同步编码一样获取我的数据。感谢 Cesar 提出使用 Promises 的建议,因为这解决了我的问题。下面是现在工作的代码。

    connection.js,也是 Cesar 所建议的。

        var mysql = require('mysql');
    
        var con = mysql.createConnection({
          host: "localhost",
          user: "username",
          password: "password",
          database: "testdb"
        });
    
        module.exports = con;
    

    query.js 页面,现在包装在一个 Promise 中;

        var con = require('./connection.js');
    
        module.exports = new Promise(function(resolve, reject){
            con.connect(function(err) {
              if (err) throw err;
              con.query("SELECT * FROM customers", function (err, result, fields) {
                if (err) throw err;
                  resolve(result);
              });
            });
        });
    

    app.js,在端口 3000 访问时,会使用 db 数据呈现 display.ejs

        var dataMod = require('./query.js');
        var express = require('express');
    
        var app = express();
    
        app.set('view engine', 'ejs');
    
        app.get('/', function(request, response){
    
          dataMod.then(function(data){
              response.render('display', {data: data});
          });
    
        });
    
        app.listen(3000);
    

    还有简单的 display.ejs 页面

        <!DOCTYPE html>
        <html>
          <body>
            <p> <%= data[0].name %> <%= data[0].address %></p>
            <p> <%= data[1].name %> <%= data[1].address %></p>
            <p> <%= data[2].name %> <%= data[2].address %></p>
          </body>
        </html>
    

    显示的内容

    公司 37 号高速公路

    市锡尼特公路 27 号

    路边对待偏僻的地方

    在浏览器上!

    这只是一个示例,并且是故意硬编码的。然而,最重要的部分是使用 Promise 从数据库到浏览器的链接。谢谢塞萨尔!

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2014-10-09
      相关资源
      最近更新 更多