Javascript 节点需要异步任务
我正在尝试将nodejsrequire语法用于异步数据库查询。我希望程序等待查询完成,然后再转到下一个require,因为从数据库返回的一些信息将作为参数传递给下一个require 这是我的密码:Javascript 节点需要异步任务,javascript,node.js,require,Javascript,Node.js,Require,我正在尝试将nodejsrequire语法用于异步数据库查询。我希望程序等待查询完成,然后再转到下一个require,因为从数据库返回的一些信息将作为参数传递给下一个require 这是我的密码: const dealership = require('../models/getDealershipById.js')(id); const dealershipLeads = require('../models/getLeadsByDealershipId.js')(dealership.id)
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
和wait
包装了导出的函数:
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
和wait
:
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()
重要:作为旁注,请避免
从id=“+id+”;“
的经销商处选择*因为这是一个非常糟糕的安全反模式,如果id
未正确消毒,则很容易允许SQL代码注入。如果您的驱动程序允许,可以使用类似于pool.query(“SELECT*FROM dealerships WHERE id=?”、[id]、…)的方法,或者使用驱动程序或包装器来替换它。如果您的问题中只有一行代码,那么使用async
关键字是没有意义的。只需返回db.getCollection('foo').find({id}).toArray()
直接返回的承诺(假设它确实返回了承诺,否则无论如何都不会工作)。您是对的,但我假设所需的JS文件将比直接返回承诺有更多的处理。否则,只需返回原始承诺,并且不需要在所需模块中使用async/Wait。很抱歉,我应该指定,我正在使用回调(我已使用模块代码更新了问题)。你知道如何使用回调吗?是的,我刚刚编辑了我的答案以反映这一点。也请阅读最后的重要提示!