You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:31:55