Py学习  »  DATABASE

如何导出mysql查询返回的“result”?

Logan Luedtke • 5 年前 • 919 次点击  

我试图使用node js将MySql数据最终放置在HTML(实际上是ejs)页面中。

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

我最终想做的是对“result”使用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”中的任何内容都是本地的。如果是这样的话,我考虑使用“模块”。函数中的exports=result',但这也会在接收文件中返回未定义的变量。如果有人知道为什么会这样,或者有解决办法,我将非常感谢你的建议:)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49809
 
919 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Logan Luedtke
Reply   •   1 楼
Logan Luedtke    6 年前

我已经开始工作了!问题是我的查询是一个异步函数,我希望得到我的数据就好像我在同步编码一样。谢谢你的建议,塞萨尔使用承诺,因为这是解决我的问题。下面是正在工作的代码。

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

    var mysql = require('mysql');

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

    module.exports = con;

现在包装在promise中的query.js页面;

    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);
          });
        });
    });

当在3000端口访问app.js时,它将用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);

以及simple 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从数据库链接到浏览器。谢谢塞萨尔!

Cesar
Reply   •   2 楼
Cesar    6 年前

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

我建议您导出数据库连接变量,以便您可以随时使用它,例如:

配置js

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

使用sresult.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连接对象。记住干燥原则。

顺便说一下,我建议您使用promise而不是callbacks函数,这样您就可以管理异步调用

希望我能帮忙!