Botkit 松弛机器人错误"Could not load team while processing webhook"



我创建了一个简单的express服务器,并添加了一个/slack/receive路由来处理Slack事件API的webhook请求:

// routes.js (which is used by my app defined in server.js)
...
let slack = require('./controllers/slack');
router.post('/slack/receive', slack.receive);
...

然后我使用Botkit创建一个简单的Slack应用程序:

// controllers/slack.js
'use strict';
const logger = require('../config/winston');
// initialise firebase storage for botkit
const admin = require('firebase-admin');
var serviceAccount = require('../config/firebase.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
var db = admin.firestore();
db.settings({
timestampsInSnapshots: true
})
// initialise botkit for slack
const botkit = require('botkit');
const controller = botkit.slackbot({
storage: require('botkit-storage-firestore')({ database: db }),
clientId: process.env.SLACK_CLIENT_ID,
clientSecret: process.env.SLACK_CLIENT_SECRET,
clientSigningSecret: process.env.SLACK_SIGNING_SECRET,
redirectUri: process.env.SLACK_REDIRECT,
disable_startup_messages: true,
send_via_rtm: false,
debug: true,
scopes: ['bot', 'chat:write:bot'],
})
controller.hears('Hello', 'direct_mention,direct_message', (bot, message) => {
logger.info(message);
bot.reply(message, 'I heard a message!');
})
exports.receive = (req, res, next) => {
res.sendStatus(200);
logger.debug(req.body);
controller.handleWebhookPayload(req, res);
};

服务器正确初始化,但一旦松弛的webhook收到请求,就会发生以下错误:

Could not load team while processing webhook:  Error: could not find team T5VDRMWKX
at E:Documentsupper-revolutionsnode_modulesbotkitlibSlackBot.js:169:24
at firebaseRef.doc.get.then.catch.err (E:Documentsupper-revolutionsnode_modulesbotkit-storage-firestoresrcindex.js:86:13)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:118:7)

到目前为止,我发现:

  • 在botkit slackbot中有/没有存储没有区别
  • 由于未执行controller.hears()中的代码,因此handleWebhookPayload方法中发生错误

发生此错误是因为botkit需要某种形式的存储,它可以存储所有团队(频道和用户),并在以后重试。

因此,当你的方法handleWebhookPayload被执行时,它会调用另一个名为findAppropriateTeam,它将在您提供的存储中查询指定的团队记录(可能是mongoDB或JSON文件或其他文件)。错误是说您在存储中没有提供id的任何记录。

因此,这可能涉及两件事:

  1. 您没有为botkit的工作提供存储空间
  2. 您没有将团队id保存在存储中

第一个问题的解决方法很简单。您只需要在机器中安装mongodb,然后将MONGO_URL传递给botkit。

注意:我看到您使用的是botkit简单存储,这可能是问题所在,因为我也遇到过这种存储无法保存记录的问题。

const controller = botkit.slackbot({
storage: 'mongodb//localhost:27017:/yourdb',
})
//OR
const controller = botkit.slackbot({
storage: process.env.MONGO_URL,
})

第二个问题的可能解决方案:

我假设您在本地使用botkit,所以您必须使用一些隧道,如ngrok或localtunnel。在这种情况下,请确保:

  1. 您向Slack提供了重定向URL(例如,https://your_url/oauth)
  2. 您访问了https://your_url/login第页

当您访问/login路由并授权应用程序时,Botkit会将您的团队id保存在提供的存储中。因此,如果你跳过了这一部分,那么botkit将不会保存你的团队id,因此当你稍后收到事件时,会抛出一个错误。

像这样检查[https://github.com/howdyai/botkit/issues/938]关于主题的讨论

我希望这能有所帮助!