需要帮助:如何解决此功能?

Posted

技术标签:

【中文标题】需要帮助:如何解决此功能?【英文标题】:Need Help : How do I resolve this function? 【发布时间】:2021-12-25 04:22:49 【问题描述】:
const getDbInfo = (anArrayOfIDs) => 
    return new Promise(function(resolve, reject)
        let arrayOfDbInfoToSendBack = [];
        for(let i = 0; i <= anArrayOfIDs.length-1; i++)
            pool.query(
                "SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID = '" +
                anArrayOfIDs[i] +
            "';",
            async(err, res) => 
                if (err) 
                    console.log("error: ", err);
                   else 
                      for(let k = 0; k <= res.length-1; k++)
                         arrayOfDbInfoToSendBack.push(res);
                          
                      
                      resolve(arrayOfDbInfoToSendBack);
                      
                  
            
            );
            
        
    );

预期此函数会返回包含信息的对象数组。我怀疑我使用的解析不正确,当我想要一个包含多个对象的数组时,它会返回一个只有 1 个对象的数组。

【问题讨论】:

为什么"SELECT * FROM tbl_ofInfo` WHERE tbl_ofInfo.sqlID = '" + anArrayOfIDs[i] + "';"` 而不是 "SELECT * FROM tbl_ofInfo` WHERE tbl_ofInfo.sqlID in ('" + anArrayOfIDs。加入(“,”)+“)';”`?也可能是更高的优先级,但这可能容易受到an SQL injection 的攻击——最好还是使用准备好的语句。 为了便于阅读,我对其进行了简化。我的问题是它解决得太快了。我想在解决之前完全构建数组。 注意 SQL 注入 :) 将 Promis 中的函数设为异步函数 等待池结果,就像下面的答案一样,将解析添加到其范围之外 【参考方案1】:

在 SQL 中,每个查询都是一个 Promise,因此无需在 Promise 内查询。为了简化解析,您可以使用 async/await。

//Setting function asynchronous
const getDbInfo = async (anArrayOfIDs) =>  
    let arrayOfDbInfoToSendBack = [];
    for(let i = 0; i <= anArrayOfIDs.length-1; i++)
       let query = "SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID = '" + anArrayOfIDs[i] + "';"

       //Awaiting until the sql query resolved or rejected
       await pool.query(query,(err, res)=>
           if (err) console.error(err)
           else 
               for(let k = 0; k <= res.length-1; k++)
                   arrayOfDbInfoToSendBack.push(res);
           
       )
    

顺便说一句,如果您在路线之外声明此功能,我不确定它是否会起作用。因为 Nodejs 会在服务器启动后尝试执行它,并且由于找不到 anArrayOfIDs 的参数而失败。因此,请在您的路线中使用该功能。如果您必须经常使用它,请将您的函数移动到不同的 .js 文件,从那里导出,然后将其作为中间件导入到您要使用的位置。

【讨论】:

【参考方案2】:

如果返回的一个对象是正确的,那么问题可以归结为您在 for 循环内解决这一事实。 这意味着只调用第一次迭代,然后由于 promise 已经解决,那么考虑到pool.query 的回调性质,下一次迭代已经过时了我会假设在它可以解决问题之前放置 await

const getDbInfo = (anArrayOfIDs) => 
    return new Promise(async function (resolve, reject) 
        let arrayOfDbInfoToSendBack = [];
        anArrayOfIDs.forEach(async (id) => 
            await pool.query(
                "SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID = '" +
                id +
                "';",
                async (err, res) => 
                    if (err) 
                        console.log("error: ", err);
                     else 
                        for (let k = 0; k <= res.length - 1; k++) 
                            arrayOfDbInfoToSendBack.push(res);

                        


                    
                
            );
            resolve(arrayOfDbInfoToSendBack);
        );
    );

【讨论】:

【参考方案3】:

这段代码有效吗?

const getDbInfo = (anArrayOfIDs) => 
  return new Promise(function(resolve, reject) 
    pool.query("SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID IN (?)", anArrayOfIDs ,
      (err, res) => 
          if (err) 
          console.log("error: ", err);
          reject(err);
          return;
         

        resolve(res)        
      
    );       
  );

【讨论】:

不,它只是解析.. 它没有发回一个应该在解析之前构建的数组。 是否需要在 Promise @FCP 中?你说它没有解决是什么意思?你兑现承诺了吗?喜欢getDbInfo([1,2,3]).then(res =&gt; console.log(res));const result = await getDbInfo([1,2,3]);

以上是关于需要帮助:如何解决此功能?的主要内容,如果未能解决你的问题,请参考以下文章

RestAssured 获取请求中的 pathParam() 方法出现红色下划线错误以及如何解决此问题

如何解决此内存泄漏?

Django 装饰器。需要帮助以找到基于类的视图的解决方案

我创建了通知功能并收到此错误“未定义索引:用户”如何解决?

我需要帮助解决这个 JDBC 异常错误,如何解决这个问题?

(Python)我该如何解决这个问题?每次重复我的功能时,我都需要一个计数器