Node.js MySQL查询无法将MySQL结果分配给变量

时间:2019-08-21 13:31:10

标签: javascript mysql node.js asynchronous

我试图将MySQL查询结果分配给一个变量,然后在脚本中多次使用它。我想这样做是因为我有PHP背景并且喜欢以此方式工作。我知道Node.js异步工作,所以这是我的问题。

在下面的代码中,我想将MySQL结果分配给sql_results变量,但是connection.query函数异步工作,并且代码以不同的顺序工作。在这种情况下,当我console.log(sql_results)返回代码undefined时,在我的代码末尾。这是正常现象,因为当我检查控制台输出时,我清楚地看到console.log(sql_results)console.log(results)之前起作用。

var mysql = require('mysql');

var connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "1234",
  database: "db_progress"
});

var sql_query = "SELECT * FROM db_progress.tblresults res WHERE res.id < 3";
var sql_results; // This is my variable

connection.connect();

connection.query(sql_query, function (error, results, fields) {
  if (error) throw error;
  console.log(results); // This is mysql results
  sql_results = results; // I am sure this works but I can't see
});

connection.end();

console.log(sql_results); // This returns undefined because works before query

如何为变量分配MySQL结果,或者是否为此目的使用其他方法。请详细说明。

谢谢。

3 个答案:

答案 0 :(得分:0)

Node js函数异步工作,所以我建议将您的查询与promise一起使用。

class Database {
            constructor( config ) {
                this.connection = mysql.createConnection( config );
            }
            query( sql, args ) {
                return new Promise( ( resolve, reject ) => {
                    this.connection.query( sql, args, ( err, rows ) => {
                        if ( err )
                            return reject( err );
                        resolve( rows );
                    } );
                } );
            }
            close() {
                return new Promise( ( resolve, reject ) => {
                    this.connection.end( err => {
                        if ( err )
                            return reject( err );
                        resolve();
                    } );
                } );
            }
        }

答案 1 :(得分:0)

请尝试替换此代码,

connection.query(sql_query, function (error, results, fields) {
  if (error) throw error;
  console.log(results); // This is mysql results
  sql_results = results; // I am sure this works but I can't see
});

connection.end();

与此

connection.query(sql_query)
    .then( results=> {
        sql_results = results;
        return connection.close();
    } );

Danmoreng已经提到了有关Promisesasync/await的文章。它们将帮助您了解上述代码的工作原理。

答案 2 :(得分:-1)

查询的结果将在回调函数中返回,该函数执行的时间比调用代码的时间晚。在设置sql_results之前,您正在调用代码的上下文中记录结果。

尝试一下:

var mysql = require('mysql');

var connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "1234",
  database: "db_progress"
});

var sql_query = "SELECT * FROM db_progress.tblresults res WHERE res.id < 3";
var sql_results; // This is my variable

connection.connect();

connection.query(sql_query, function (error, results, fields) {
  if (error) throw error;
  console.log(results); // This is mysql results
  sql_results = results; // I am sure this works but I can't see
  console.log(sql_results);
});

connection.end();