【问题标题】:Node.js MySQL query can't assign MySQL results to a variableNode.js MySQL 查询无法将 MySQL 结果分配给变量
【发布时间】:2019-08-21 21:47:17
【问题描述】:

我正在尝试将 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 结果分配给一个变量,或者是否有不同的方法用于此目的。请详细说明。

谢谢。

【问题讨论】:

  • 正如您已经指出的数据库查询是异步的。因此,您不能以您在此处尝试的方式使用该变量。你想用它做什么,都必须在connection.query的回调函数之后发生。您可能想了解Promisesasync/await
  • 是的,你是对的。我已经阅读了有关Promisesasycn/await 的主题。首先,有些人不建议asycn/await 他们说这不是Node.js 的工作方式。对于Promises,实际上我无法真正理解 Node.js 中的工作结构

标签: javascript mysql node.js asynchronous


【解决方案1】:

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

【讨论】:

  • 我在link 看到了这个例子,它也不起作用。
【解决方案2】:

可能会尝试替换此代码,

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 的文章。他们将帮助您了解上述代码的工作原理。

【讨论】:

  • 嗨,当我使用这种方式时,我得到了这个错误。 TypeError: connection.query(...).then is not a function
  • 如果没有任何效果,请尝试关注this?
【解决方案3】:

您的查询结果将在回调函数中返回,该函数在调用代码之后执行。在设置 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();

【讨论】:

  • 嗯,是的,我可以这样做,但这并不能解决我的问题,因为我想使用与查询函数分开的 sql_results 变量。如果想在connection.end() 行之后使用其他一些功能,我仍然会遇到同样的异步问题。
  • @Qencezero,我建议您重新阅读我的答案,因为它解释了回调的工作原理。你不能做你想做的事。
  • @Danmoreng 这个问题在我发布答案后被编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多