try代码块中调用异步函数返回undefined的问题修复咨询
修复异步函数返回undefined的问题
你的问题核心在于findDoc函数没有正确返回异步操作的结果——它内部用了回调函数,但整个函数本身没有返回一个Promise,导致await无法等待异步查询完成,直接拿到了undefined。
解决方案:让findDoc返回Promise
因为await只能作用于Promise(或async函数),我们可以直接利用Mongoose的exec()方法本身就返回Promise的特性,改造findDoc:
function findDoc(rowObj) { // 直接返回exec()生成的Promise,错误会被主try-catch捕获 return Database.findOne({ 'name': rowObj.name }, '_id, foreign_id').exec(); }
如果你更喜欢用async/await的写法让代码更直观,也可以改成这样:
async function findDoc(rowObj) { try { const docs = await Database.findOne({ 'name': rowObj.name }, '_id, foreign_id').exec(); return docs; } catch (err) { // 抛出错误,让外层的try-catch处理 throw err; } }
为什么原来的代码会返回undefined?
原来的findDoc函数没有任何返回语句,所以默认返回undefined。而你在回调里写的return docs,只是回调函数自己的返回值,根本不会传递到外层的findDoc函数中。当你用await去等待一个不是Promise的值时,JS会把它包装成一个已解决的Promise,结果就是undefined。
修改后,findDoc返回了查询操作的Promise,await会等待这个Promise完成,拿到正确的查询结果,同时如果查询出错,错误会被外层的try-catch捕获。
验证效果
修改后运行代码,输出会变成:
before CORRECT OBJECT after
内容的提问来源于stack exchange,提问作者ChrisBull
相关产品推荐
相关产品推荐

