Botkit slackbot错误“处理Webhook时无法加载团队”

时间:2018-10-13 18:18:19

标签: express slack-api botkit

我创建了一个简单的快速服务器,并添加了一条/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:\Documents\upper-revolutions\node_modules\botkit\lib\SlackBot.js:169:24
    at firebaseRef.doc.get.then.catch.err (E:\Documents\upper-revolutions\node_modules\botkit-storage-firestore\src\index.js:86:13)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:118:7)

到目前为止,我已经发现:

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

1 个答案:

答案 0 :(得分:0)

之所以会发生此错误,是因为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]一样检查有关该主题的论述

我希望这会有所帮助!