首页 > 解决方案 > Nestjs 守卫中的空请求主体(错误?)

问题描述

    @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我得到空的身体。为什么会这样?看起来像一个错误。

附言

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

标签: typescriptnestjs

解决方案


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


推荐阅读