在调用控制器逻辑之前,我想要验证我的Express路由。我使用joi创建了一个验证器,该验证器能够根据模式对象验证请求对象。
import { Request, Response, NextFunction } from 'express';
import joi, { SchemaLike, ValidationError, ValidationResult } from '@hapi/joi';
import { injectable } from 'inversify';
@injectable()
export abstract class RequestValidator {
protected validateRequest = (validationSchema: SchemaLike, request: Request, response: Response, next: NextFunction): void => {
const validationResult: ValidationResult<Request> = joi.validate(request, validationSchema, {
abortEarly: false
});
const { error }: { error: ValidationError } = validationResult;
if (error) {
response.status(400).json({
message: 'The request validation failed.',
details: error.details
});
} else {
next();
}
}
}
接下来,我创建了一个派生类,用于创建validationSchema并调用validateRequest
方法。为了简单起见,我将展示“deleteUserById”验证。
import { Request, Response, NextFunction } from 'express';
import joi, { SchemaLike } from '@hapi/joi';
import { injectable } from 'inversify';
import { RequestValidator } from './RequestValidator';
@injectable()
export class UserRequestValidator extends RequestValidator {
public deleteUserByIdValidation = async (request: Request, response: Response, next: NextFunction): Promise<void> => {
const validationSchema: SchemaLike = joi.object().keys({
params: joi.object().keys({
id: joi.number().required(),
})
});
this.validateRequest(validationSchema, request, response, next);
}
}
重要提示: 我这样创建SchemaLike
是因为有些路由可能需要在一次运行中验证params、body、query
。
在调用路由时:
DELETE /users/1
验证总是失败。出现以下错误:
UnhandledPromiseRejectionWarning: TypeError: joi_1.default.validate不是一个函数
每次验证都会出现此错误,无论是否正确调用。有人知道如何解决吗?