Express 必须运行一个验证吗?

Express 必须运行一个验证吗?,express,express-validator,Express,Express Validator,我正在尝试验证Todo应用程序的补丁请求有效负载,该应用程序应至少具有文本或值属性。我在updateTodoValidators中这样做。这两个属性都是可选的,但至少必须存在一个属性(因此必须存在oneOf),如果存在,则必须在oneOf之外的验证器指示时有效 const validate=(验证)=>{ 返回异步(req、res、next)=>{ 等待Promise.all(validations.map(validation=>validation.run(req)); 常量错误=验证结果(

我正在尝试验证Todo应用程序的
补丁
请求有效负载,该应用程序应至少具有
文本
属性。我在
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的
my
validate()
抛出一个
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()
函数,因此它出错了

这是一个悬而未决的问题


目前,我认为您需要实现自己的自定义函数来验证这些条件参数。

我也在尝试解决这个问题。你找到解决办法了吗?