Express开发技能提前注册bodyParser触发适配器报错如何解决?
错误原因
你使用的ExpressAdapter(通常为Alexa技能开发套件提供的Express适配器)内部内置了请求体解析逻辑,需要读取原始请求流完成签名校验。全局注册bodyParser.json()会提前消费请求流,导致适配器无法读取原始内容触发报错。
解决方案
使用express.json(Express v4.16.0+已内置,无需额外引入bodyParser)的verify配置项,在解析JSON请求体的同时把原始请求Buffer挂载到请求对象上,适配器会优先读取已缓存的原始Buffer完成校验,不会再重复消费请求流。
修改后的代码示例
const app: express.Application = express() // Skill entry point const skill = application.getSkillBuilder.createSkillForWebService() const adapter = new ExpressAdapter(skill, config.verifySignature, config.verifyTimestamp) // 替换原来的bodyParser.json() app.use(express.json({ verify: (req: any, res, buf) => { // 挂载原始Buffer供适配器校验使用 req.rawBody = buf } })) // 你的自定义中间件可以正常读取req.body app.use((req: any, res: any, next: () => void) => { console.log(req.body) next() // 必须调用next()否则请求会卡住,原代码漏了这行 }) app.post("/", adapter.getRequestHandlers()) const listener = app.listen(PORT, function () { const { address, port } = listener.address() as AddressInfo logger.debug("%s listening to %s%s", app.name, address, port) })
注意事项
- 如果你仍使用旧版Express不支持内置
express.json,可以把相同配置换到bodyParser.json的入参里,效果完全一致。
内容的提问来源于stack exchange,提问作者linker85
相关产品推荐
相关产品推荐

