【发布时间】:2019-08-11 04:07:16
【问题描述】:
我创建了一个中间件,在调用控制器逻辑之前验证请求输入。
假设我有一个“通过 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),并且用户ID 可用。我错过了什么?
编辑:
我知道我可以验证req.params,但如果我想更新用户怎么办?我必须验证参数(userId)和正文(姓名,年龄,...)
【问题讨论】:
-
如果
userID在req.params中可用,那么您是否应该验证req.params?例如joi.validate(req.params, schema) -
@Igor 是的,但我需要验证参数和正文。我将 userId 作为参数传入,但正文中也可能有要验证的变量。
标签: javascript node.js express joi