管道接收到的嵌套参数
Nest param received by pipe
所以在使用 nestjs
开发简单的 REST 端点时,我发现了一个小问题。
我有一个名为 JoiValidationPipe
的管道,它使用 Joi 对象验证请求的主体。一切正常,但如果请求同时包含正文和参数,我会遇到问题:
@Patch(':id')
@UsePipes(new JoiValidationPipe(CreateComicSchema))
async updateComic(@Body() comic: Comic, @Param() params) {
comic.id = params.id;
return await this.comicService.update(comic);
}
这里JoiValidationPipe接收到的参数只是请求url中的id
,不是body.
我想知道是否可以强制 Pipe 接收请求的主体。
如果url中没有参数则不存在此问题,JoiValidatinPipe
自动接收正文
创建漫画
@Post()
@UsePipes(new JoiValidationPipe(CreateComicSchema))
async createComic(@Body() comic: Comic) {
return await this.comicService.create(comic);
}
JoiValidationPipe
import * as Joi from 'joi';
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class JoiValidationPipe implements PipeTransform {
constructor(private readonly schema) {}
transform(value: any, metadata: ArgumentMetadata) {
const { error } = Joi.validate(value, this.schema);
if (error) {
throw new BadRequestException('Validation failed');
}
return value;
}
}
Pipes
仅验证某些特定类型参数(Body
、Param
等)的最佳用途是给出一个 class(或实例) 作为这些装饰器的参数。
例如
async updateComic(@Body(new ValidationPipe({ whitelist: true }) comic: Comic, @Param() params) {
这里,管道仅应用于@Body
。但是我没有使用 @UsePipes
因为这不是 required/desired.
所以在使用 nestjs
开发简单的 REST 端点时,我发现了一个小问题。
我有一个名为 JoiValidationPipe
的管道,它使用 Joi 对象验证请求的主体。一切正常,但如果请求同时包含正文和参数,我会遇到问题:
@Patch(':id')
@UsePipes(new JoiValidationPipe(CreateComicSchema))
async updateComic(@Body() comic: Comic, @Param() params) {
comic.id = params.id;
return await this.comicService.update(comic);
}
这里JoiValidationPipe接收到的参数只是请求url中的id
,不是body.
我想知道是否可以强制 Pipe 接收请求的主体。
如果url中没有参数则不存在此问题,JoiValidatinPipe
自动接收正文
创建漫画
@Post()
@UsePipes(new JoiValidationPipe(CreateComicSchema))
async createComic(@Body() comic: Comic) {
return await this.comicService.create(comic);
}
JoiValidationPipe
import * as Joi from 'joi';
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class JoiValidationPipe implements PipeTransform {
constructor(private readonly schema) {}
transform(value: any, metadata: ArgumentMetadata) {
const { error } = Joi.validate(value, this.schema);
if (error) {
throw new BadRequestException('Validation failed');
}
return value;
}
}
Pipes
仅验证某些特定类型参数(Body
、Param
等)的最佳用途是给出一个 class(或实例) 作为这些装饰器的参数。
例如
async updateComic(@Body(new ValidationPipe({ whitelist: true }) comic: Comic, @Param() params) {
这里,管道仅应用于@Body
。但是我没有使用 @UsePipes
因为这不是 required/desired.