hrp*_*xQ4 12 javascript node.js express typescript joi
我想在调用控制器逻辑之前验证我的Express路由。我使用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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我创建了一个派生类,该类创建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);
}
}
Run Code Online (Sandbox Code Playgroud)
重要说明:SchemaLike之所以创建这种方式,是因为某些路线可能params, body, query需要在一次运行中进行验证。
拨打路线时
删除/ users / 1
验证总是失败。我得到这个错误
UnhandledPromiseRejectionWarning:类型错误:joi_1.default.validate不是函数
无论是否正确调用,每次验证都会发生此错误。有人知道如何解决吗?
Vaa*_*oor 17
joi 的更新版本不适用于Joi.validate(req.body,schema);无需单独使用该对象。如下使用。它对我很顺利。如果我有任何错误,请告诉我:
const Joi = require('@hapi/joi');
const schema = Joi.object({
name:Joi.string().min(3).required(),
email:Joi.string().min(4).required().email(),
password:Joi.string().min(6).required()
});
router.post('/register', async (req,res) => {
//updated joi
// This is a shorter version
const { error } = schema.validate(req.body);
// Error in response
res.send(error.details[0].message);
// WORKING WITH DEPRECATED VERSION
// const Validation = Joi.validate(req.body,schema);
// res.send(Validation);
Run Code Online (Sandbox Code Playgroud)
您可以通过更改joi.validate(request, validationSchema为v16中不再支持的validationSchema.validate(requestAs joi.validate()来修复它。API文档和发行说明中清楚地记录了该文档。
小智 9
我经历joi.validate()的不是函数也。我检查了他们的文档并修复了它。
const Joi = require('@hapi/joi');
const schema = Joi.object({
name:Joi.string().min(6).required(),
email:Joi.string().min(6).required().email(),
password:Joi.string().min(6).required()
});
router.post('/register', (req, res) => {
// VALIDATE BEFORE SAVING A USER
const Validation = schema.validate(req.body);
res.send(Validation);
})
Run Code Online (Sandbox Code Playgroud)
这按预期工作,不会产生进一步的错误。
小智 7
您可以通过更改Joi.validate(request, validationSchema)为v16 中不再支持validationSchema.validate(request)As来修复它
Joi.validate()。
对于新版本
const schema = Joi.object({ name: Joi.string() .min(6) .required(),
email: Joi.string() .min(6) .required() .email(),
password: Joi.string() .min(6) .required() });
const validation = schema.validate(req.body);
Run Code Online (Sandbox Code Playgroud)
使用时遇到相同的问题express-joi-validation。
如果可以使用版本15,则降级的Joi会成功。
npm uninstall --save @hapi/joi
npm install --save @hapi/joi@15.0.3
Run Code Online (Sandbox Code Playgroud)
与其降级,Joi不如赶紧看看最新版本的API,看看正确的使用方法。
这是目前最新的 Joi API 的链接 (16.1.7),您可以在其中看到使用validate.
此外,为了确保您知道您使用的下一个版本的 lib 中发生了哪些更改,最好查看发行说明,这里是 Joi 16 版发行说明的链接,您可以在其中查看所有更改/新功能,仅供参考,您可以看到有关validate方法的信息:
删除 Joi.validate() 和 Joi.describe()(改为直接调用架构)(#1941)
| 归档时间: |
|
| 查看次数: |
3270 次 |
| 最近记录: |