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();
        }
    }
}
接下来,我创建了一个派生类,该类创建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需要在一次运行中进行验证。
拨打路线时
删除/ 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);
您可以通过更改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);
    
})
这按预期工作,不会产生进一步的错误。
小智 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);
使用时遇到相同的问题express-joi-validation。
如果可以使用版本15,则降级的Joi会成功。
npm uninstall --save @hapi/joi
npm install --save @hapi/joi@15.0.3
与其降级,Joi不如赶紧看看最新版本的API,看看正确的使用方法。
这是目前最新的 Joi API 的链接 (16.1.7),您可以在其中看到使用validate.
此外,为了确保您知道您使用的下一个版本的 lib 中发生了哪些更改,最好查看发行说明,这里是 Joi 16 版发行说明的链接,您可以在其中查看所有更改/新功能,仅供参考,您可以看到有关validate方法的信息:
删除 Joi.validate() 和 Joi.describe()(改为直接调用架构)(#1941)
| 归档时间: | 
 | 
| 查看次数: | 3270 次 | 
| 最近记录: |