解决办法:
在专用于验证的文件中创建 middleware 和 scheme 以供 celebrate 使用(这将是一个简单的身份验证示例):
import { celebrate, Joi } from 'celebrate';
export const authenticate = celebrate({
headers: Joi.object().keys({
client: Joi.string().required(),
application: Joi.string().required(),
}).unknown(),
body: Joi.object().keys({
email: Joi.string().email().required(),
password: Joi.string().required(),
}),
});
以后怎么用?将其导入模块并将其作为middleware 应用,因为celebrate 返回一个function (req, res, next) 类型的函数:
import { Module, NestModule, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
// Others imports ...
import { authenticate } from './validations/authenticate.validation';
@Module({
imports: [ // Your imports... ],
controllers: [ // Your controllers... ],
providers: [ // Your providers... ],
})
export class AuthenticationModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
// Validate Login.
consumer.apply(authenticate).forRoutes({ path: 'security/login', method: RequestMethod.POST });
}
}
配置中定义的path必须明显匹配控制器的endpoint:
import {
Body,
Post,
Headers,
Controller,
} from '@nestjs/common';
@Controller('security')
export class AuthenticationController {
@Post('login')
async authenticate(
@Body('email') email: string,
@Body('password') password: string,
@Headers('application') application: string): Promise<any> {
// Autenticate user
}
}
参考文献:
https://docs.nestjs.com/middleware
https://www.npmjs.com/package/celebrate