You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bolt-JS开发Slack机器人斜杠命令验证报错问题求助

BoltJS Slack机器人请求验证问题解决方案
  • 默认无需手动调用verify()方法:BoltJS初始化时只要传入了signingSecret参数,框架会在所有业务处理器(包括app.command()斜杠命令处理器)接收到请求前,自动完成Slack官方要求的签名校验,校验不通过的请求会直接被拦截返回401状态码,无需在业务层额外实现验证逻辑。
  • 如需自定义验证逻辑获取完整原始请求,可通过自定义接收器实现,两种常用方案如下:
    1. 使用ExpressReceiver时插入自定义中间件
    const { App, ExpressReceiver } = require('@slack/bolt');
    
    const receiver = new ExpressReceiver({
      signingSecret: process.env.SLACK_SIGNING_SECRET,
    });
    
    // 该中间件会在Bolt处理请求前执行,可拿到完整原始请求对象
    receiver.app.use((req, res, next) => {
      // 此处req包含所有请求头、原始请求体、流对象等信息,可执行自定义验证
      next();
    });
    
    const app = new App({
      receiver,
      token: process.env.SLACK_BOT_TOKEN,
    });
    
    1. 使用默认HTTPReceiver时通过beforeRequest钩子获取请求
    const { App, HTTPReceiver } = require('@slack/bolt');
    
    const receiver = new HTTPReceiver({
      signingSecret: process.env.SLACK_SIGNING_SECRET,
      // 钩子会在Bolt处理所有请求前触发
      beforeRequest: ({ req, res }) => {
        // 此处可获取完整入站req对象,执行自定义验证逻辑
      }
    });
    
    const app = new App({
      receiver,
      token: process.env.SLACK_BOT_TOKEN,
    });
    
  • 报错原因说明:你之前遇到的TypeError: stream.on is not a function报错,是因为verify()方法要求入参为完整原始HTTP请求对象(包含请求签名头、时间戳头、原始未解析请求体、流对象),而app.command()拿到的payload是框架解析后的数据结构,完全不满足方法入参要求,所以会抛出类型错误。

内容的提问来源于stack exchange,提问作者kevkö

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:06:01