繁体   English   中英

使用 joi 验证整个请求对象

[英]validate the whole request object with joi

我创建了一个中间件,在调用控制器逻辑之前验证请求输入。

假设我有一个“通过 id 获取用户” - 路线

const usersController = require('../controllers/users.js');
const usersControllerPolicy = require('../policies/users.js');

router.get('/:userId', usersControllerPolicy.getUserById, usersController.getUserById);

// other routes

在执行控制器之前,我使用策略来验证参数和正文。 我的用户政策模块是

const joi = require('joi');
const schemaValidation = require('../middleware/schemaValidation.js');

module.exports = {
    getUserById: (req, res, next) => {
        schemaValidation({
            userId: joi.string().guid().required()
        }, req, res, next);
    }

    // other routes
}

userId是路由参数,而不是正文中的变量。 schemaValidation中间件验证给定的架构并调用next()或发送400响应。

const joi = require('joi');
const requestResponder = require('../helpers/requestResponder.js');

module.exports = (schema, req, res, next) => {
    const { error } = joi.validate(req, schema);

    if (error)
        return requestResponder.sendBadRequestError(res);

    next();
}

当我使用/users/137eaa6f-75c2-46f0-ba7c-c196fbfa367f调用此路由时,我收到此错误

消息:'“userId”是必需的'

但验证应该没问题。 我通过记录req.params检查了验证joi.validate(req, schema)并且 userId 可用。 我错过了什么?


编辑:

我知道我可以验证req.params但如果我想更新用户怎么办? 我必须验证参数(userId)和正文(姓名,年龄,...)

您的 joi 验证架构应该反映req对象结构,这应该可以工作:

const joi = require('joi');
const schemaValidation = require('../middleware/schemaValidation.js');

module.exports = {
    getUserById: (req, res, next) => {
        schemaValidation(joi.object({
            params: joi.object({
                userId: joi.string().guid().required()
            }).unknown(true)
        }).unknown(true), req, res, next);
    }

    // other routes
}

当您需要同时验证 body 和 params 时:

const joi = require('joi');
const schemaValidation = require('../middleware/schemaValidation.js');

const paramsValidation = joi.object({
    userId: joi.string().guid().required()
}).unknown(true);

const bodyValidation = joi.object({
    name: joi.string().required()
}).unknown(true);

module.exports = {
    getUserById: (req, res, next) => {
        schemaValidation(joi.object({
            params: paramsValidation,
            body: bodyValidation
        }).unknown(true), req, res, next);
    }

    // other routes
}

但我更愿意用 3 个 joi 模式(主体、参数、查询)分别验证它们,例如它是如何在这里完成的https://www.npmjs.com/package/express-joi-validation#validation-ordering

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM