【问题标题】:Botkit slackbot error "Could not load team while processing webhook"Botkit slackbot 错误“处理 webhook 时无法加载团队”
【发布时间】:2018-10-13 18:18:19
【问题描述】:

我创建了一个简单的快速服务器并添加了一个/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);
};

服务器初始化正确,但只要 slack 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() 中的代码没有被执行

【问题讨论】:

    标签: express slack-api botkit


    【解决方案1】:

    出现此错误是因为 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] 一样检查这个主题以了解有关该主题的讨论

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2018-01-06
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多