如何将查询的结果对象存储到nodejs中的对象变量[duplicate]

问题描述 投票:0回答:1

我正在使用此查询从products表中选择所有记录,我想将它们存储在一个对象变量中,以后我可以将它用于其他目的,所以我尝试了这个

 var SelectQuery = "Select * FROM `products`";
 var ProductDetails = {};
 conn.query(SelectQuery, function (err, result) {
     if(err) {
        console.log(err);
      } else {
        ProductDetails = result;
      }
 });

 console.log(ProductDetails);

但在控制台我得到这个{}

javascript node.js express
1个回答
0
投票

(感谢用户jfriend00在我的原始答案中指出了一个主要的疏忽)

如果conn.query返回promise,那么你可以通过使用async/await以你描述的方式完成这项工作:

async function getProducts() {
     var SelectQuery = "Select * FROM `products`";
     var ProductDetails = {};
     await conn.query(SelectQuery, function(err, result) {
         if (err) {
             console.log(err);
         } else {
             ProductDetails = result;
         }
     });    

    console.log(ProductDetails);
}

但请注意,只有当你的conn.query返回一个承诺时,这才有效。此外,它是一个较新的ES功能,因此您可能需要根据节点版本进行转换。另外,请注意,发生的功能需要用async包装。

否则,其他用于处理异步性的候选人是callback functionsPromises

如果conn.query没有返回一个promise,你可以编写自己的查询实现来返回一个promise,这样你就可以利用async / await

function asyncQuery(sqlQuery) {
    return new Promise((resolve, reject) => {
        conn.query(SelectQuery, function(err, result) {
             if (err) {
                 reject(err);
             } else {
                 resolve(result);
             }
         })
    })
}

然后原始函数可以重写为:

async function getProducts() {
    var SelectQuery = "Select * FROM `products`";
    var ProductDetails = await asyncQuery(SelectQuery);
    console.log(ProductDetails);
}
© www.soinside.com 2019 - 2024. All rights reserved.