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

Node.js调用Facebook Graph API发送消息时遇Socket hang up异常求助

解决Facebook Messenger Webhook回复时的Socket Hang Up错误

我来帮你排查这个ECONNRESET(socket hang up)错误,结合你的代码和这类问题的常见坑,有几个可行的修复方向:

1. 换掉已弃用的request库

首先要提醒你:request库早在2020年就停止维护了,它的老旧版本和现代Node.js环境、HTTPS请求的兼容性问题很可能是导致连接被重置的核心原因。建议换成更可靠的现代HTTP库,比如axios或者node-fetch。

用Axios重构发送消息的代码:

先安装依赖:

npm install axios

然后修改sendTextMessage函数:

const axios = require('axios');

const sendTextMessage = async (senderId, text) => {
  try {
    const response = await axios.post(
      'https://graph.facebook.com/v2.6/me/messages',
      {
        messaging_type: "UPDATE",
        recipient: { id: senderId },
        message: { text: text }
      },
      {
        params: { access_token: FACEBOOK_ACCESS_TOKEN },
        timeout: 10000 // 设置10秒超时,避免连接长时间挂起
      }
    );
    console.log('Facebook API响应:', response.data);
  } catch (error) {
    console.error('发送消息失败:', error.response?.data || error.message);
  }
};

2. 若坚持用request,修复配置并补全错误处理

你的request调用有两个明显问题:缺少错误处理回调,也没有设置超时等关键配置。可以这样修改:

const sendTextMessage = (senderId, text) => {
  let req = {
    url: 'https://graph.facebook.com/v2.6/me/messages',
    qs: { access_token: FACEBOOK_ACCESS_TOKEN },
    method: 'POST',
    json: {
      messaging_type: "UPDATE",
      recipient: { id: senderId },
      message: { text: text }
    },
    timeout: 10000, // 添加超时限制
    agentOptions: {
      rejectUnauthorized: false // 临时绕过证书验证(生产环境不建议,优先更新Node.js版本解决证书问题)
    }
  };
  // request的回调是(error, response, body)三个参数,你之前只写了response,漏掉了错误捕获
  request(req, (error, response, body) => {
    if (error) {
      console.error('发送请求出错:', error);
      return;
    }
    console.log('响应状态码:', response.statusCode);
    console.log('响应内容:', body);
  });
};

3. 确保Webhook及时返回响应给Facebook

Facebook要求Webhook必须在20秒内返回200状态,如果你的代码在等Dialogflow的响应后才回复Facebook,很可能触发超时,间接引发连接问题。正确的做法是先给Facebook返回确认,再异步处理消息回复:

修改messageWebhook的导出函数:

module.exports = (req, res) => {
  // 先立即返回200给Facebook,避免Webhook超时
  res.status(200).send('EVENT_RECEIVED');

  const event = req.body.entry[0].messaging[0];
  const senderId = event.sender.id;
  const message = event.message.text;

  const apiaiSession = apiAiClient.textRequest(message, { sessionId: 'total-poc-bot' });

  apiaiSession.on('response', (response) => {
    const result = response.result.fulfillment.speech;
    sendTextMessage(senderId, result);
  });

  apiaiSession.on('error', error => console.log(error));
  apiaiSession.end();
};

之前的代码没有正确处理req和res对象,Facebook收不到及时响应,也可能导致后续的API请求异常。

4. 检查网络和防火墙设置

如果你的服务器在防火墙、代理或者云服务商的安全组后面,要确保允许出站请求到graph.facebook.com:443。有些环境会默认阻止外部HTTPS请求,这也会导致连接被重置。


内容的提问来源于stack exchange,提问作者Murtaza Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:21