问题描述
我正在尝试将NodeJS require语法用于异步数据库查询。我希望程序等待查询完成后再继续执行下一个需求,因为从数据库返回的某些信息将作为参数传递给下一个需求。
这是我的代码:
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
和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
和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],...)
的名称,或者用允许的驱动程序或包装程序将其替换。