使用Bolt-JS开发Slack机器人斜杠命令验证报错问题求助
BoltJS Slack机器人请求验证问题解决方案
- 默认无需手动调用
verify()方法:BoltJS初始化时只要传入了signingSecret参数,框架会在所有业务处理器(包括app.command()斜杠命令处理器)接收到请求前,自动完成Slack官方要求的签名校验,校验不通过的请求会直接被拦截返回401状态码,无需在业务层额外实现验证逻辑。 - 如需自定义验证逻辑获取完整原始请求,可通过自定义接收器实现,两种常用方案如下:
- 使用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, });- 使用默认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ö
相关产品推荐
相关产品推荐

