mysql - NodeJS MySQL 将查询与多个模型查询的响应连接到一个 Controller 调用

标签 mysql node.js asynchronous

我在理解 NodeJS 上的异步方法时遇到问题。

我的 Controller 中有这段代码:

 app.get(basePath, function (req, res, next) {

        model.generateDB(function (modelErr, modelRes) {
            if (modelErr) console.log('Error: ' + modelErr);
            next(res.send(modelRes));
        });

    });

该模型的代码片段:

generateDB: function (next) {

        BDManager.query(
            'INSERT INTO tableName' +
            '(field1, field2) VALUES ("a", "b")',
        function (err, res) { 
            next(err, res); 
        });

    }

以及数据库管理器的这段代码

query: function (sql, next) {

    var con = mysql.createConnection(config.MySQL);

    con.query(sql, function (err, res) {
        if (err) next(err, null);
        next(null, res);
    });

    con.end();

}

对我来说效果很好。问题是我如何才能有多个查询,并且它们在模型中只有一个 Controller 调用的响应,如示例(不起作用):

BDManager.query(
    'INSERT INTO tableName' +
    '(field1, field2) VALUES ("a", "b")',
function (err, res) { 
    next(err, res); 
});
BDManager.query(
    'INSERT INTO tableName' +
    '(field1, field2) VALUES ("a", "b")',
function (err, res) { 
    next(err, res); 
});
BDManager.query(
    'INSERT INTO tableName' +
    '(field1, field2) VALUES ("a", "b")',
function (err, res) { 
    next(err, res); 
});

这个想法可能是获取一系列错误和响应,但我不知道如何在所有查询完成后发送它。我尝试使用 .then,但似乎不起作用(我使用 .then 得到的错误是“不能在 null 上使用 then”)。

另一种解决方案可能是将多个查询连接在一起,但我尝试使用“;”分隔符,但对我不起作用。

最佳答案

所以这是使用回调(.then 用于 promise )。您可以围绕它创建一个 promise 包装器,让您对其进行 promise ,然后您可以等待它们,或者如果您想并行运行它们,则可以使用promise.all。

例如:

function promiseQuery(query, params) {
  return new Promise((resolve, reject) => {
    BDManager.query(query, params, function (err, res) {  
      if (err) return reject(err);
      return resolve(res);
    });
  });
}


let arrayOfResponses = await Promise.all([
  promiseQuery(query1, params1),
  promiseQuery(query2, params2),
  promiseQuery(query3, params3),
]);

关于这一点,您可能应该通过参数化输入插入值。您的 SQL 库应该支持该功能

此外,错误也会导致拒绝。如果您想捕获这些错误并将它们推送到数组中,您也可以使用 .catch 处理程序来实现。

如果您不使用 async/await 或兼容的 Node 版本,您还可以执行以下操作:

Promise.all([]).then(arrayOfResponses => {});

同样,这将为您提供传递给promise.all 的任何 promise 的响应数组。

有大量关于如何使用 Promise 及其工作原理的文章,但这应该可以帮助您入门。

关于mysql - NodeJS MySQL 将查询与多个模型查询的响应连接到一个 Controller 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54092866/

相关文章:

c# - 如何使顺序处理像并行处理一样简单

mysql - 存储过程问题,在本地运行但不在服务器上运行

php - 在 php 中用数组更新 Mysql Row

javascript - 在继续之前需要 FineUploader 方法 uploadStoredFiles 完成

javascript - 当我将 JS 对象发送到 Node.js 服务器并要求返回相同的对象时,服务器发回修改后的对象

javascript - 根据发出请求的位置获取本地日期

python - 如何从池中获取第一个完成的异步结果

mysql - 简单删除sql表中的重复内容

php搜索引擎多个关键字/标签

javascript - 需要帮助在 SmartMobileStudio 中导入 NodeJS-Module "htmlparser2"