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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:06:03