【问题标题】:Empty request body in a nestjs guard (bug?)Nestjs 守卫中的空请求主体(错误?)
【发布时间】:2020-06-18 23:48:20
【问题描述】:
    @Post()
    @UseGuards(
        CategoryVerificationGuard,
        VerboseAuthGuard,
        UniqueEntryTitleGuard,
    )
    @UseInterceptors(FileFieldsInterceptor([
        { name: AttachmentsName.IMAGES, maxCount: AttachmentMaxCount.IMAGES },
    ]))
    public async createEntry(@UploadedFiles() attachedFiles: IUploadFile[],
                             @Body() createEntryBodyDto: CreateEntryBodyDto,
                             @Headers('authorization') authHeader: string): Promise<any> {
        return this.entryService.create(getUserIdByAuthHeader(authHeader), {attachedFiles, ...createEntryBodyDto});
    }

守卫的代码:

@Injectable()
export class CategoryVerificationGuard implements CanActivate {
    constructor(
        // private readonly categoriesService: CategoriesService,
    ) {}

    public async canActivate(ctx: ExecutionContext): Promise<boolean> {
        const request = ctx.switchToHttp().getRequest<Request>();
        const requestBody: IConfirmationCodeValidation = request.body;
        const requestHeaders: IncomingHttpHeaders = request.headers;

        console.log('BODY', requestBody);
        console.log('HEADERS', requestHeaders);
        return true;
    }
}

如果我设置multipart form 我会得到空的身体。为什么会这样?看起来像一个错误。

附言

然而,可以访问标题,但由于某种原因正文为空......

【问题讨论】:

    标签: typescript nestjs


    【解决方案1】:

    守卫在拦截器之前被激活。在这种情况下,multipart form 数据由FileInterceptorFilesInterceptor 处理(取决于发送的文件数量)。因为主体是在拦截器中分配的(由于在调用multer 时),所以这是预期的功能,因为主体没有被适当的中间件解析。如果您愿意,可以决定在您的main.ts 中自行调用multer(),具体取决于传入的标头类型。

    【讨论】:

    • 嗯,我不确定我是否理解。 multer 是什么?它是在引擎盖下起作用的东西吗?您能否再详细说明一下?
    • multer 是一个多部分表单数据请求解析器,它是 Nest 用于 FileInterceptor/FilesInterceptor/FilesFieldsInterceptor as said in the docs 的内容。它是一个标准的 Express 中间件,类似于 body-parser
    • 我已经检查过了,是的,它似乎是在引擎盖下工作的模块。所以看起来我可以使用multer() 来访问该守卫内的请求正文。但是我该怎么做呢?你有什么建议吗?
    • 就像我说的,在您的main.ts 中,您可以直接调用中间件来进行解析。如果你这样做,你就不需要FileFieldsInterceptor,只要记住你应该在调用中间件之前验证传入的请求是multipart/form-data。要调用它,您通常会使用 app.use(multer()),就像在 express 中一样。
    猜你喜欢
    • 2020-05-29
    • 2022-08-11
    • 2020-11-20
    • 2023-03-16
    • 2020-07-20
    • 1970-01-01
    • 2016-04-06
    • 2019-09-14
    • 2020-07-01
    相关资源
    最近更新 更多