在 node.js 中运行嵌套的 mysql 查询

Runing nested mysql queries in node.js

我正在尝试构建一个对象数组并使用 ejs 呈现它们。对象数组来自 table 名为 products 的数据库。我能够 运行 查询并获取产品数据,但我需要 运行 使用产品的类别 ID 对每个产品进行嵌套查询,以获取类别名称等其他信息(在另一个 table).我尝试在每个产品上使用 foreach 循环和 运行 嵌套查询,但问题是因为 foreach 循环中的嵌套查询是异步完成的,我无法从 foreach 外部提供数据。

有没有办法 运行 多个查询并将数据保存到变量并从查询回调外部提供该变量?

我的部分代码

database.con.query('SELECT * FROM products', (err, products) => {
if(err) throw err;
let productsArr = products; // productsArr will hold all data to be rendered
productsArr.forEach((product, index) => {

  database.con.query(`SELECT * FROM category WHERE Id = ${product.Category_id}`, (err, category) => {
    if(err) throw err;
    productsArr[index].cat = category[0]; // Save the categories of each product as a property
  }); // End of nested query

});// End of foreach

res.render('products/index.ejs', {products: productsArr}); // 'productsArr' have all products data but not the categories (cat propery) of each product
});

注意:我可以运行一个联合查询一次性获取所有数据,但我需要知道如何使用上述方法修复它原因

我希望我的英语不好。感谢任何帮助

我想到了这样的事情:(注:未测试)

database.con.query('SELECT * FROM products', (err, products) => {

    if (err) throw err;

    let wrapper = products.map((product) => {
        return new Promise((resolve, reject) => {

            database.con.query(`SELECT * FROM category WHERE Id = ${product.Category_id}`, (err, category) => {
                if (err) {

                    reject(err);

                } else {

                    resolve(category[0]);

                };
            });

        });
    });


    Promise.all(all).then((results) => {

        let arr = products.map((product, index) => {
            product.cat = results[index];
            return product;
        });

        res.render('products/index.ejs', {
            products: arr
        });

    }).catch((err) => {

        console.error(err);

    });



});