Javascript 数据库查询函数未异步运行
因此,我在我的节点服务器中创建了一个函数,它接收一个查询字符串,在我的数据库中运行它,然后返回结果。然后,我想在整个路由中使用异步等待异步使用我的函数,而不是在嵌套查询、嵌套查询、嵌套查询等中使用嵌套查询 下面是代码:Javascript 数据库查询函数未异步运行,javascript,mysql,node.js,express,asynchronous,Javascript,Mysql,Node.js,Express,Asynchronous,因此,我在我的节点服务器中创建了一个函数,它接收一个查询字符串,在我的数据库中运行它,然后返回结果。然后,我想在整个路由中使用异步等待异步使用我的函数,而不是在嵌套查询、嵌套查询、嵌套查询等中使用嵌套查询 下面是代码: const runQuery = queryString => { console.log("...runQuery") db.query(queryString, (error, results, fields) => { if (
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个条目,但不幸的是,它什么也不返回。意思是results在发送时是一个空变量,这意味着JS永远不会正确地等待它捕获db结果。我如何异步使用我的函数,这怎么可能呢?看起来你的函数runQuery没有返回承诺,事实上,它没有返回任何东西。在db.query函数的回调中使用return,而不是函数runQuery本身 由于runQuery正在执行异步操作,因此应该通过一个承诺来解析结果,而这个承诺正是您的请求处理程序中等待的内容 我不太确定,但您似乎正在使用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"
})
}
})
请注意,如果发生错误,promisified函数将拒绝该错误,并且它不会存储在请求处理程序的results变量中。相反,将抛出一个需要处理的错误。因此,将任何异步/等待调用放入try/catch中始终是一个好的做法。什么是您的db对象?它是我从另一个文件导入的基本mysql连接对象。我知道它是一个连接对象。当人们问起这个问题时,我们通常指的是把代码也放进去,或者像mysql那样描述它。您正在尝试使用Promise,但并非所有软件包都提供Promise SupportHHH。对此表示歉意。但是,是的,我今天再次检查了这个问题,发现mysql包没有promise支持。我的数据库连接来自普通的mysql包。非常感谢Anuj,你的回答很有效,并且教会了我一些关于承诺的东西!我很抱歉没有提到我使用的是基本的mysql包。事实证明,正如另一位用户所提到的,并非所有软件包都支持承诺。我假设所有db管理包都自动应用了promise包装器。我是一名实习生,所以这对我来说有点陌生,但你的回答帮助我找到了一种新的动态方式来使用Promise JS类。非常感谢。不幸的是,我的支持率太低,无法提高投票率,否则你会得到一个。对不起:不客气!没关系,我们都是来学习的。继续编码!