因此,我在节点服务器中创建了一个函数,该函数接收查询字符串,在数据库上运行它,然后返回结果。然后,我想在整个路由中使用异步等待来异步使用我的函数,而不是在嵌套查询,嵌套查询,嵌套查询等中使用嵌套查询。
下面是代码:
const runQuery = queryString => {
console.log("...runQuery")
db.query(queryString, (error, results, fields) => {
if (error) {
console.log("runQeury: FAILURE");
return error;
}
else {
console.log("runQeury: SUCCESS");
return(results);
}
})
}
register.post("/", async (req, res) => {
console.log(req.body);
const results = await runQuery("select * from test1");
res.send(results);
})
数据库应该有3个条目,但是不幸的是,它什么也不返回。意味着结果在发送时是一个空变量,这意味着JS永远不会适当地等待它捕获数据库结果。我该如何异步使用我的函数,这怎么可能呢?
答案 0 :(得分:1)
似乎您的函数“ runQuery”没有返回承诺,实际上,它没有返回任何内容。您在db.query函数的回调中使用“返回”,而不是函数“ runQuery”本身。
由于runQuery正在执行异步操作,所以应该通过一个promise(这是您的请求处理程序中的“等待”所寻找的)来解析结果。
我不确定,但似乎您使用的是MySql,并且在mysql软件包的npm页面上找不到与要查询的内容有关的任何内容,因此我们自己对其进行确认:
const runQuery = (queryString) => new Promise((resolve,reject) => {
console.log("...runQuery")
db.query(queryString, (error, results, fields) => {
if (error) {
console.error("runQuery: FAILURE");
reject(error);
} else {
console.log("runQeury: SUCCESS");
resolve(results);
}
})
})
register.post("/", async (req, res) => {
console.log(req.body);
try{
const results = await runQuery("select * from test1");
res.send(results);
}catch(e){
console.error(`ERROR THROWN BY runQuery:`,e);
res.status(500).send({
message: e.message || "INTERNAL SERVER ERROR"
})
}
})
请注意,如果发生错误,我们的承诺函数将拒绝该错误,并且不会将其存储在请求处理程序的“结果”变量中。相反,将引发需要处理的错误。因此,将所有异步/等待调用放入try / catch中是始终的好习惯。