Express 必须运行一个验证吗?
我正在尝试验证Todo应用程序的Express 必须运行一个验证吗?,express,express-validator,Express,Express Validator,我正在尝试验证Todo应用程序的补丁请求有效负载,该应用程序应至少具有文本或值属性。我在updateTodoValidators中这样做。这两个属性都是可选的,但至少必须存在一个属性(因此必须存在oneOf),如果存在,则必须在oneOf之外的验证器指示时有效 const validate=(验证)=>{ 返回异步(req、res、next)=>{ 等待Promise.all(validations.map(validation=>validation.run(req)); 常量错误=验证结果(
补丁
请求有效负载,该应用程序应至少具有文本
或值
属性。我在updateTodoValidators
中这样做。这两个属性都是可选的,但至少必须存在一个属性(因此必须存在oneOf
),如果存在,则必须在oneOf
之外的验证器指示时有效
const validate=(验证)=>{
返回异步(req、res、next)=>{
等待Promise.all(validations.map(validation=>validation.run(req));
常量错误=验证结果(req)
if(errors.isEmpty()){
返回next();
}
物件
.地位(422)
.json({
有效载荷:{
错误:errors.array()
},
消息:“验证错误”,
错误:正确
})
}
}
常量updateTodoValidators=[
其中之一([
正文('text').exists().withMessage('notspecified'),
正文('value').exists().withMessage('notspecified'))
]),
正文('text')。可选().trim().notEmpty().withMessage('不能为空'),
正文('value')。可选().isInt({min:1})。withMessage('必须是有效的正数')
]
app.patch('/todos/:id',validate(updateTodoValidators),async(req,res,next)=>{/*路由处理程序实现*/})
出于代码可读性的目的,我正在考虑强制运行验证,如中所示。我发现,如果我有一些验证涉及一个one的myvalidate()
抛出一个TypeError
说validation.run
不是一个函数。下面是详细说明错误的堆栈跟踪:
(node:88997) UnhandledPromiseRejectionWarning: TypeError: validation.run is not a function
at Promise.all.validations.map.validation (/Users/alejandro/code/Production/server/validators/validate.js:6:64)
at Array.map (<anonymous>)
at /Users/alejandro/code/Production/server/validators/validate.js:6:35
at Layer.handle [as handle_request] (/Users/alejandro/code/Production/server/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/alejandro/code/Production/server/node_modules/express/lib/router/route.js:137:13)
at loginRequired (/Users/alejandro/code/Production/server/auth/helpers.js:18:24)
at Layer.handle [as handle_request] (/Users/alejandro/code/Production/server/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/alejandro/code/Production/server/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/alejandro/code/Production/server/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/alejandro/code/Production/server/node_modules/express/lib/router/layer.js:95:5)
(node:88997) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:88997) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(节点:88997)未处理的PromisejectionWarning:TypeError:validation.run不是函数
在Promise.all.validations.map.validation(/Users/alejandro/code/Production/server/validators/validate.js:6:64)
在Array.map()处
在/Users/alejandro/code/Production/server/validators/validate.js:6:35
在Layer.handle[as handle_request](/Users/alejandro/code/Production/server/node_modules/express/lib/router/Layer.js:95:5)
接下来(/Users/alejandro/code/Production/server/node_modules/express/lib/router/route.js:137:13)
需要登录时(/Users/alejandro/code/Production/server/auth/helpers.js:18:24)
在Layer.handle[as handle_request](/Users/alejandro/code/Production/server/node_modules/express/lib/router/Layer.js:95:5)
接下来(/Users/alejandro/code/Production/server/node_modules/express/lib/router/route.js:137:13)
在Route.dispatch(/Users/alejandro/code/Production/server/node_modules/express/lib/router/Route.js:112:3)
在Layer.handle[as handle_request](/Users/alejandro/code/Production/server/node_modules/express/lib/router/Layer.js:95:5)
(节点:88997)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:1)
(节点:88997)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
所以,我的问题是:当验证可能涉及到一个或多个s
s中的一个时,是否有任何方法强制运行验证?我最终手动完成了验证
对两个参数检查执行.run()
。然后验证两者上的\u errors
属性是否为空
export const validateTokens = async (req, res, next) => {
// Check to make sure one of the header tokens is set and a UUID
const token1 = await header('token1')
.isUUID()
.run(req);
const token2 = await header('token2')
.isUUID()
.run(req);
// Manual oneOf
if (isEmpty(token1._errors) || isEmpty(token2._errors)) {
return next();
}
// Return error results
res.status(400).send('Must include either token1 or token2');
};
oneOf
返回中间件实例,而不是验证链。它没有客户中间件验证器用来验证的.run()
函数,因此它出错了
这是一个悬而未决的问题
目前,我认为您需要实现自己的自定义函数来验证这些条件参数。我也在尝试解决这个问题。你找到解决办法了吗?