Node.js中async/await搭配数据库查询返回undefined问题排查
问题原因
你这段代码里SomeMethod用的是回调函数处理异步SQL查询,但它本身没有返回任何值,更没有返回Promise。await只能等待Promise对象,所以var a拿到的自然是undefined。
解决方案
把SomeMethod改写成返回Promise的形式,这样await才能正确捕获异步操作的结果:
app.get('/someApi', async (req, res) => { try { var a = await SomeMethod(); // 这里可以基于a执行后续逻辑 res.send({ result: a }); } catch (err) { // 捕获SQL查询抛出的错误 res.status(500).send({ error: err.message }); } }) function SomeMethod() { return new Promise((resolve, reject) => { let sql = 'SELECT * FROM someTable'; db.query(sql, (err, results) => { if (err) { // 用reject传递错误 return reject(err); } // 替换成你的实际判断逻辑 if (results.length > 0) { resolve(true); } else { resolve(false); } }); }); }
如果用Node.js内置的util模块,还可以用promisify快速把回调风格的db.query转成Promise风格:
const util = require('util'); // 生成Promise版本的查询方法 const queryPromise = util.promisify(db.query); app.get('/someApi', async (req, res) => { try { var a = await SomeMethod(); res.send({ result: a }); } catch (err) { res.status(500).send({ error: err.message }); } }) async function SomeMethod() { let sql = 'SELECT * FROM someTable'; const results = await queryPromise(sql); // 替换成你的实际判断逻辑 return results.length > 0 ? true : false; }
关键注意点
- 回调函数里的
return true/false只是回调自身的返回值,根本不会成为SomeMethod的返回值,这是你之前代码的核心问题 - 必须用
try/catch包裹await代码,否则异步错误会被静默忽略
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

