I would like to make my route Query
parameter required. If it is missing I expect it to throw 404 HTTP error.
@Controller('')
export class AppController {
constructor() {}
@Get('/businessdata/messages')
public async getAllMessages(
@Query('startDate', ValidateDate) startDate: string,
@Query('endDate', ValidateDate) endDate: string,
): Promise<string> {
...
}
}
I'm using NestJs pipes to determine if a parameter is valid, but not if it exists And I'm not sure that Pipes are made for that.
So how can I check in NestJS if my param exists if not throw an error?
Use class-validator
. Pipes are definitely made for that !
Example : create-user.dto.ts
import { IsNotEmpty } from 'class-validator';
export class CreateUserDto {
@IsNotEmpty()
password: string;
}
For more information see class-validator
documentation : https://github.com/typestack/class-validator
And NestJS Pipes & Validation documentation : https://docs.nestjs.com/pipes https://docs.nestjs.com/techniques/validation
NestJS does not provide a decorator (like @Query
) that detects undefined value in request.query[key]
.
You can write custom decorator for that:
import { createParamDecorator, ExecutionContext, BadRequestException } from '@nestjs/common'
export const QueryRequired = createParamDecorator(
(key: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest()
const value = request.query[key]
if (value === undefined) {
throw new BadRequestException(`Missing required query param: '${key}'`)
}
return value
}
)
Then use @QueryRequired
decorator as you would use @Query
:
@Get()
async someMethod(@QueryRequired('requiredParam') requiredParam: string): Promise<any> {
...
}
有一个简单的方法来验证你的参数, https: //docs.nestjs.com/techniques/validation
In addition to Phi's answer, you can combine the use of class-validator
with the following global validation pipe:
app.useGlobalPipes(
new ValidationPipe({
/*
If set to true, instead of stripping non-whitelisted
properties validator will throw an exception.
*/
forbidNonWhitelisted: true,
/*
If set to true, validator will strip validated (returned)
object of any properties that do not use any validation decorators.
*/
whitelist: true,
}),
);
I use this in order to only allow parameters defined in the DTO class so that it will throw an error when unknown parameters are sent with the request!
In Phie's example, a post request with a body like {password: 'mypassword'}
will pass the validation when {password: 'mypassword', other: 'reject me!'}
won't.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.