Я хочу проверить свои экспресс-маршруты перед вызовом логики контроллера. Я использую joi и создал валидатор, который может проверять объект Request по объекту схемы.
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
, которые необходимо проверить за один проход.
При звонке на Маршрут
УДАЛИТЬ / пользователей / 1
проверка всегда терпит неудачу. Я получаю эту ошибку
UnhandledPromiseRejectionWarning: TypeError: joi_1.default.validate не является функцией
Ошибка возникает при каждой проверке, независимо от того, правильно она вызвана или нет. Кто-нибудь знает как исправить?