mysql - NodeJS MySQL concat 查询以及来自许多模型查询对一个控制器调用的响应
问题描述
我在理解 nodejs 上的异步方法时遇到问题。
我的控制器中有这段代码:
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();
}
这对我来说可以。问题是我怎么可能有多个查询,它们是模型中的响应,只有一个控制器调用,例如示例(不起作用):
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.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 或兼容的节点版本,您还可以执行以下操作:
Promise.all([]).then(arrayOfResponses => {});
同样,这将为您提供传递给 promise.all 的任何承诺的响应数组。
有大量关于如何使用 Promises 以及它们如何工作的文章,但这应该可以帮助您入门。
推荐阅读
- security - 在 rust 中生成安全的随机字节
- r - 创建新的分类变量(高、中、低)
- sql-server - 在 dockerfile 中启动 sql 服务后运行脚本
- c - 如何检查值是否为空?
- c++ - 如何退出/中断控制台应用程序中的 Windows 消息循环和 Windows 桌面应用程序的尊重?
- ruby-on-rails - 进行捆绑更新时的错误
- c++ - 读取不断更新的文件 (C++)
- java - 我在我的代码中输入了一些用于控制台的东西,但我找不到我搞砸的地方
- python - 有没有更简单的方法可以创建这样的数组?
- android - Firebase Analytics 未显示 Android 应用的每日活跃用户数