首页 > 解决方案 > 用于页面的 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)

请帮我。非常感谢

标签: node.js

解决方案


您正面临此问题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();
            }
        });
    })
}

推荐阅读