javascript - NodeJS 需要异步任务
问题描述
我正在尝试将 NodeJS 要求语法与异步数据库查询一起使用。我希望程序在进入下一个要求之前等待查询完成,因为从数据库返回的一些信息作为参数传递给下一个要求。
这是我的代码:
const dealership = require('../models/getDealershipById.js')(id);
const dealershipLeads = require('../models/getLeadsByDealershipId.js')(dealership.id);
const dealershipStaff = require('../models/getStaffByDealershipId.js')(dealership.id);
return [dealership, dealershipLeads, dealershipStaff];
我尝试将其包装在匿名异步函数中,但这不起作用。有谁知道如何做到这一点?
这是我的模块代码:
module.exports = function(id) {
const pool = require('../loaders/pool.js')();
pool.query('SELECT * FROM dealerships WHERE id = \'' + id + '\';', (err,
res)
=> {
if(err) console.error(err.stack);
return res.rows[0];
});
};
解决方案
据我了解,您已使用async
and包装了导出的函数await
:
module.exports = function(id) {
return new Promise((resolve, reject) => {
const pool = require('../loaders/pool.js')();
pool.query(
"SELECT * FROM dealerships WHERE id = '" + id + "';",
(err, res) => {
if (err) {
console.error(err.stack);
reject(err);
}
else {
resolve(res.rows[0]);
}
}
);
});
};
所以现在只需在调用代码中使用async
and :await
async function getData() {
const dealership = await require('../models/getDealershipById.js')(id);
const dealershipLeads = await require('../models/getLeadsByDealershipId.js')(dealership.id);
const dealershipStaff = await require('../models/getStaffByDealershipId.js')(dealership.id);
}
getData()
重要:作为旁注,请避免"SELECT * FROM dealerships WHERE id = '" + id + "';"
,因为这是一个非常糟糕的安全反模式,如果id
没有正确清理它很容易允许 SQL 代码注入。如果您的驱动程序允许,请使用类似的东西pool.query("SELECT * FROM dealerships WHERE id = ?", [id], ...)
,或者用允许的驱动程序或包装器替换它。
推荐阅读
- python - 如何使用底层 pd.Dataframe 创建可切片的 torch.Dataset?
- pandas - 将非均匀空格分隔的浮点数列表拆分为 2 列
- .net-core - 如何访问 Airbnb API?或 Airbnb 正确的令牌?
- beautifulsoup - 搜索 a href 时的结果相乘
- clips - 如何在 CLIPS 中实现集合(例如列表)以及如何查询这样的集合
- logging - 过滤底物日志
- python - 计算数据框中的值对出现在另一个数据框中的频率
- c - 如何按照以下代码在 c 编程中安静地执行函数调用?
- javascript - JS动画文本
- opengl - 通过 glUniform1fv (...) 或 glUniform1f(...) 将值为 0.0f 的浮点变量传输到着色器时出现问题