node.js - 用于页面的 Nodejs Facebook 聊天机器人
问题描述
所以我尝试用 node.js 为我的页面制作一个简单的聊天机器人。我将 webhook 与 messenger 连接成功,但是当我发送消息时。它没有回复。:) 看起来你的帖子主要是代码;请添加更多细节。看起来您的帖子主要是代码;请添加更多细节。看起来您的帖子主要是代码;请添加更多细节。这是我的代码
var http = require('http');
var bodyParser = require('body-parser');
var express = require('express');
var app = express();
app.use(bodyParser.urlencoded({
extended: false
}));
var server = http.createServer(app);
var request = require("request");
app.get('/', (req, res) => {
res.send("Home page. Server running okay.");
});
app.get('/webhook', function(req, res) { // Đây là path để validate tooken bên app facebook gửi qua
if (req.query['hub.verify_token'] === VALIDATION_TOKEN) {
res.send(req.query['hub.challenge']);
}
res.send('Error, wrong validation token');
});
app.post('/webhook/', function(req, res) {
var messaging_events = req.body.entry[0].messaging;
for (var i = 0; i < messaging_events.length; i++) {
var event = req.body.entry[0].messaging[i];
var sender = event.sender.id;
if (event.message && event.message.text) {
var text = event.message.text;
sendTextMessage(sender, text + "!");
}
}
res.sendStatus(200);
});
function sendTextMessage(sender, text) {
var messageData = {
text: text
};
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {
access_token: PAGE_ACCESS_TOKEN
},
method: 'POST',
json: {
recipient: {
id: sender
},
message: messageData,
}
}, function(error, response, body) {
if (error) {
console.log('Error:', error);
} else if (response.body.error) {
console.log('Error: ', response.body.error);
}
});
}
app.set('port', process.env.PORT || 5000);
server.listen(app.get('port'), function() {
console.log("Chat bot server listening at %d ", app.get('port'));
});
我在 ide 上在线运行它,这里是错误
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (/home/runner/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/home/runner/node_modules/express/lib/response.js:170:12)
at evalmachine.<anonymous>:23:7
at Layer.handle [as handle_request] (/home/runner/node_modules/express/lib/router/layer.js:95:5)
at next (/home/runner/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/runner/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/runner/node_modules/express/lib/router/layer.js:95:5)
at /home/runner/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/runner/node_modules/express/lib/router/index.js:335:12)
请帮我。非常感谢
解决方案
您正面临此问题Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
,因为您要发送两次响应,以解决此问题,如下所示
app.get('/webhook', function(req, res) {
if (req.query['hub.verify_token'] === VALIDATION_TOKEN) {
res.send(req.query['hub.challenge']);
} else {
res.send('Error, wrong validation token');
}
});
在 for 循环中,您正在发出异步请求。在 for 循环中触发的函数将被推送到调用堆栈,但您发送的响应将在所有请求执行之前执行。因此,要在完成 for 循环后发送响应,您可以将代码更改为,
app.post('/webhook/', function(req, res) {
var messaging_events = req.body.entry[0].messaging;
var promises = [];
for (var i = 0; i < messaging_events.length; i++) {
var event = req.body.entry[0].messaging[i];
var sender = event.sender.id;
if (event.message && event.message.text) {
var text = event.message.text;
promises.push(sendTextMessage(sender, text + "!"));
}
}
Promise.all(promises).then(function(){
res.sendStatus(200);
}).catch(function(err) {
res.sendStatus(500);
});
});
function sendTextMessage(sender, text) {
return new Promise(function(resolve, reject){
var messageData = {
text: text
};
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {
access_token: PAGE_ACCESS_TOKEN
},
method: 'POST',
json: {
recipient: {
id: sender
},
message: messageData,
}
}, function(error, response, body) {
if (error) {
console.log('Error:', error);
reject(error);
} else if (response.body.error) {
console.log('Error: ', response.body.error);
reject(error);
} else {
resolve();
}
});
})
}
推荐阅读
- r - ggplot2 boxplot 只显示垂直线
- amazon-web-services - mxnet sagemaker 负载模型
- python - 如何在美国以外的国家/地区使用 Pytrends API
- python - 通过随机选择计数零次出现
- php - 如果使用 PHP 的 SQL 查询为空,则显示一条消息
- html - CSS - 使 div 适合整个背景图像
- java - 用 Java 向 LDAP 发送加密密码
- php - Android图像上传到php服务器base64不起作用
- java - 如何使用 java 程序为 IBM MQ 设置消息 ID
- c# - Xamarin 仅链接 Sdk 程序集 - 使用 AssemblyName 与 AssemblyName.Class.Method