NodeJS MySQL如何在查询函数之外获取结果

Posted

技术标签:

【中文标题】NodeJS MySQL如何在查询函数之外获取结果【英文标题】:NodeJS MySQL How to get the result outside of the query function 【发布时间】:2015-07-26 08:52:09 【问题描述】:

我似乎无法弄清楚如何在 NodeJS mysql 池查询之外获得结果。这是一些示例代码,可以更好地解释我的意思。

var result = 'Hello world!';

var mysql = require('mysql');
var pool = mysql.createPool(
    connectionLimit : 100,
    host            : process.env.DB_HOST,
    user            : process.env.DB_USERNAME,
    password        : process.env.DB_PASSWORD,
    database        : process.env.DB_DATABASE
);

pool.query('SELECT * from user LIMIT 10', function (err, rows) 
    result = rows;
);

res.send(result);

上面将返回“Hello world!”而不是查询。

如果我在 pool.query 函数中使用 console.log(result),它会返回查询中的行,但我似乎无法在函数之外获取数据。我已经记录了这个函数并检查了所有相关的函数,我想我只是缺少一些基本的东西。

【问题讨论】:

Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference的可能重复 你知道怎么做吗?到目前为止,这里的每个人似乎都间接回答了这个问题。那些发布在答案上的链接和上面的评论 - 老实说,虽然需要知道,但 TMI - 至少现在是这样,因为我们无法立即直接体验有效的解决方案。我希望至少有一个示例代码,其中包含所有必需的元素,以亲眼目睹解决方案是否以及如何工作。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/… node 版本 8 up + async / await 在函数回调中 这个问题你解决了吗 【参考方案1】:

您在查询完成(并调用回调)之前将结果发回。在您的回调中发送结果将解决问题:

pool.query('SELECT * from user LIMIT 10', function (err, rows) 
    result = rows;
    res.send(result);
);

正如 Aaron 所指出的,这是一个常见问题。更全面的答案可以在here找到。

【讨论】:

【参考方案2】:

池查询功能是异步的。这意味着您的代码不会按照您声明语句的顺序执行。

您启动一个查询并指定一个回调函数,该函数应在查询异步操作完成时运行。

res.send 将在查询和回调声明之后立即运行,而回调将在很晚的时候运行。当您设置结果时,您已经发送了它。

尝试将你的 res.send 移动到回调中。

pool.query('SELECT * from user LIMIT 10', function (err, rows) 
    res.send(rows);
);

【讨论】:

以上是关于NodeJS MySQL如何在查询函数之外获取结果的主要内容,如果未能解决你的问题,请参考以下文章

在查询Mysql Nodejs时结果未定义

从 Nodejs 中的 mySQL 获取数据时如何从 Async/await 函数获取返回值

在返回的mysql结果中查找行数(nodejs)

nodejs查询数据库后,获取result结果集并赋值返回

应用异步 nodejs

nodejs fetch中异步函数之外的存储数组