mysql - 发出异步等待数据库调用的请求未返回正确结果。节点.js
问题描述
我想我需要帮助来理解异步等待功能。
我发出一个异步的 Post 请求:
app.post('/updateprofile', upload.none(), async function (req, res) {
try {
let retData = await mainController.updateProfile(req.body, mysql, connectionParams);
console.log(retData);
res.status(200).send(retData);
} catch (error) {
console.log(error);
}
})
正如您所知道的,发布请求调用了我的主控制器中名为 updateProfile 的异步函数:
updateProfile: async function (formData, mysql, connectionParams) {
console.log("l");
con = mysql.createConnection(connectionParams);
const result = await con.query(sql, function (err, result) {
if (err) {
console.log(err);
throw err;
}
return result;
});
con.end();
console.log("k");
if (result.affectedRows > 0) {
console.log('ffff');
return "OK"
} else {
console.log("22");
return "Fail";
}
}
由于某种原因,result.affectedRows 总是 < 0。所以我的回报总是失败。我认为通过使用 await 功能,sql 调用会在进入下一个编译的 if 语句之前等待。我当然尝试过以不同的形式使用异步。我知道我不需要使用 Promises,因为 Promise 发生在 await/async 功能的“幕后”。我可能做错了什么?
当我在代码中的 sql 查询之外的控制台日志中显示 result.affectedRow 时,它是未定义的。
解决方案
如果传递回调,则con.query
不会返回promise
。您可以在 try-catch 中通过回调或不使用回调
否则在回调中编写逻辑:
updateProfile: async function fn(formData, mysql, connectionParams) {
console.log("l");
con = mysql.createConnection(connectionParams);
return new Promise((r, rej) => {
con.query(sql, function(err, result) {
if (err) {
console.log(err);
rej(err);
}
con.end();
if (result.affectedRows > 0) {
r("OK");
} else {
rej("Fail");
}
});
});
}
使用异步等待:
async function fn(formData, mysql, connectionParams) {
console.log("l");
con = mysql.createConnection(connectionParams);
try {
const result = con.query(sql);
if (result.affectedRows > 0) {
return "OK";
} else {
return "FAIL";
}
} catch (error) {
console.log(err);
return "FAIL";
} finally {
con.end();
}
}
随着文件con.query
似乎没有回报的承诺。从callback
不会使它成为可能。您可以使用 node js util 使函数成为可承诺的。
https://github.com/mysqljs/mysql
const util = require('util');
const fs = require('fs');
const stat = util.promisify(fs.stat);
async function callStat() {
const stats = await stat('.');
console.log(`This directory is owned by ${stats.uid}`);
}
参考:https ://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original
推荐阅读
- mongodb - 如何解决mongo收集1000,000条记录加入elasticsearch索引200,000,000条记录?
- c# - 如何使用字符串的值作为对象的名称?
- python - GroupBy 和大熊猫的情节
- flutter - 在 Android 10 及更高版本中使用 Flutter 创建新的可共享文本文件
- javascript - 为什么输入焦点时会超出 div - HTML/CSS
- c++ - C++ 构造函数分段错误
- asp.net-mvc - DataFormatString = "{0:N}" 不适用于模型 MVC
- java - 如何在不使用 jsoup 的情况下从 webview 获取 html 代码?
- python - 如何在 tkinter Text 小部件中动态插入文本?
- ruby-on-rails - mingw32:轨道上的钥匙