Node.js异步函数返回Promise为undefined问题排查求助
问题分析与解决方案
嘿,我来帮你定位这个问题!你的核心问题出在Promise的resolve环节没有传递返回值,另外还有一个Promise使用的反模式需要修正,咱们一步步来:
1. 为什么会返回undefined?
你在callSendAPI里构造Promise时,最后调用resolve()的时候没有传入任何值——这就导致这个Promise最终resolved的结果是undefined。所以当sendText里用await callSendAPI(...)接收结果时,变量a自然就是undefined了。
看这段代码:
try { var a = await request(/* ... */) } catch(e) { /* ... */ } console.log('message sent!') resolve(); // 这里没有传a!
快速修复:传递resolve的值
把resolve()改成resolve(a),这样callSendAPI返回的Promise就会把请求的响应结果作为resolved的值,sendText里的a就能拿到正确的返回内容了:
console.log('message sent!') resolve(a); // 把request的响应结果传出去
2. 更优的写法:避免Promise嵌套的反模式
你在Promise构造器里使用async函数作为回调,这是一个常见的反模式。因为async函数本身就会返回Promise,再手动包一层Promise完全没必要,还可能导致错误捕获的隐患。
既然你用的是request-promise-native(它本身就返回Promise),咱们可以彻底简化代码:
重构后的callSendAPI
callSendAPI: function(sender_psid, response) { // 构造请求体 const request_body = { "recipient": { "id": sender_psid }, "message": response }; // 直接返回request的Promise,不用手动包一层 return request({ "uri": "https://graph.facebook.com/v2.6/me/messages", "qs": { "access_token": PAGE_ACCESS_TOKEN }, "method": "POST", "json": request_body }).catch(e => { console.error("Unable to send message:" + e); throw e; // 把错误抛出,让上层的catch逻辑处理 }); }
重构后的sendText
同样可以用async/await简化,不用再手动构造Promise:
sendText: async function(sender_psid, text) { const response = { "text": `${text}` }; try { const a = await module.exports.callSendAPI(sender_psid, response); console.log("Promise return from callSendAPI " + a); console.log("message sent--------------------"); } catch(e) { console.error(e); throw e; // 向上抛出错误,让调用者处理 } }
这样修改后,代码结构更清晰,Promise的返回值也能正常传递,上层的await就能正常工作了。
内容的提问来源于stack exchange,提问作者dps
相关产品推荐
相关产品推荐

