我想在调用 Controller 逻辑之前验证我的 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 is not a function
每次验证都会出现错误,无论调用是否正确。有人知道如何解决吗?
最佳答案
您可以通过更改来修复它:
joi.validate(request, validationSchema)
到:
validationSchema.validate(request)
joi.validate()
在 v16 中不再受支持。 API 文档和发行说明中对此进行了明确记录。
关于javascript - joi_1.default.validate 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57956609/