Nest.js中使用raw-body包获取Webhook原始Body时遇流不可读错误
解决Nest.js中使用raw-body包时的"stream is not readable"错误
问题原因
Nest.js默认会自动解析POST请求的请求体(依赖Express的body-parser中间件),这个过程会读取并消费掉请求流。当你再尝试用raw-body读取同一个请求对象时,流已经处于不可读状态,因此抛出stream is not readable错误。
解决方案
针对单个路由禁用自动body解析
只需要在目标路由的@Post()装饰器中添加配置,禁用该路由的body解析器,这样请求流会保持可读状态,就能正常用raw-body读取原始内容:
修改后的代码:
import { AppService } from './app.service'; import { Controller, Post, Req} from '@nestjs/common'; const getRawBody = require('raw-body'); @Controller() export class AppController { constructor(private readonly appService: AppService) {} // 添加parser: false禁用自动body解析 @Post({ parser: false }) async customerDataRequestSend(@Req() req) { // 可选:指定编码格式,比如'utf8'返回字符串;不指定则返回Buffer const rawBody = await getRawBody(req, { encoding: 'utf8' }); console.log(rawBody); return 'Raw body fetched successfully'; } }
全局禁用自动body解析(不推荐)
如果你的所有路由都需要读取原始请求体,可以在创建Nest应用时全局禁用默认的body解析器:
// main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { // 创建应用时禁用默认body解析 const app = await NestFactory.create(AppModule, { bodyParser: false }); await app.listen(3000); } bootstrap();
注意:全局禁用后,所有路由都无法使用Nest自带的
@Body()装饰器解析请求体,需要手动处理每个路由的body解析逻辑。
补充说明
虽然Nest.js提供了官方的@RawBody()装饰器可以更便捷地获取原始请求体,但如果你坚持使用raw-body包,上述方法可以解决流不可读的问题。
内容的提问来源于stack exchange,提问作者Pavel Shepelenko
相关产品推荐
相关产品推荐

