需要帮助:如何解决此功能?
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 => console.log(res));
或const result = await getDbInfo([1,2,3]);
以上是关于需要帮助:如何解决此功能?的主要内容,如果未能解决你的问题,请参考以下文章