首页 > 解决方案 > 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];
  });
};

标签: javascriptnode.jsrequire

解决方案


据我了解,您已使用asyncand包装了导出的函数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]);
                }
            }
        );
    });
};

所以现在只需在调用代码中使用asyncand :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], ...),或者用允许的驱动程序或包装器替换它。


推荐阅读