Facebook机器人和节点:清空请求查询

时间:2018-01-10 20:20:07

标签: javascript node.js facebook express

这是我在StackOverflow上的第一篇文章!

我遇到了一个我正在创建的新机器人的问题。

首先,这是我在 app.js

中的代码



# Example data frame
x <- as.data.frame(
    matrix(letters[1:10], nrow = 2)
    );

# Change names of columns 2-5
colnames(x)[2:5] <- paste0(colnames(x)[2:5], 1:4);
# Change all column names
colnames(x) <- paste0(colnames(x), 1:5);
&#13;
&#13;
&#13;

我在Facebook Developer页面上创建了应用程序并且链接了webhook: Facebook developer page: webhook

如果你继续https://my-personal-bot.herokuapp.com/,应该说

  

正确部署

但如果你去这里

  

https://my-personal-bot.herokuapp.com/webhook

会说:

  

凭据无效

如果我记录import express from 'express'; import bodyParser from 'body-parser'; import mongoose from "mongoose"; import { VERIFY_TOKEN, PORT, MONGODB_URI } from './config'; import { botLogic } from './logic'; mongoose.Promise = global.Promise; mongoose.connect(MONGODB_URI, { useMongoClient: true }); const app = express(); app.use(bodyParser.urlencoded({extended: false})); app.use(bodyParser.json()); app.get('/', (req, res) => { res.send('Correcly deployed!'); }); app.get('/webhook', (req, res) => { if(req.query['hub.verify_token'] === VERIFY_TOKEN) { res.send(req.query['hub.challenge']); } res.send('Invalid credentials'); }); app.post('/webhook/', async (req, res) => { try { await res.sendStatus(200); await Promise.all(req.body.entry.map(async entry => { await Promise.all(entry.messaging.map(async update => { console.log(`Received update from ${update.sender.id}`); await botLogic(update); })); })); } catch (e) { console.error(e); } }); app.get('*', (req, res) => { res.status('404').send('Nothing interesting here'); }); app.listen(PORT, function() { console.log('running on port', PORT); });,结果就是一个空对象。

Logs screenshot

我之前构建了几个机器人,这个初始设置非常简单,但是,在这个特殊情况下,我无法弄清楚问题出在哪里。我使用的API版本是 v2.11 ,这是我以前机器人的唯一区别。

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

来自Facebook的webhooks的主体只是json编码,所以摆脱添加url编码的行:

app.use(bodyParser.urlencoded({extended: false}));

此外,请求是使用您的应用密钥加密的,因此您需要在使用bodyParser.json()之前对其进行解码

app.use(xhub({algorithm: 'sha1', secret: process.env.APP_SECRET }));

当然你想在heroku控制台中设置你的env变量APP_SECRET

有关webhooks的完整示例用法,请查看https://github.com/mduppes/webhooks_test/blob/master/index.js