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
相关产品推荐
相关产品推荐

