NodeJS Express 嵌套输入主体对象验证

Arm*_*asi 8 javascript validation node.js express

我在使用“express-validator”包验证我的嵌套对象请求正文时遇到了一些麻烦。假设我们有一个方法来收集用户输入的主体如下:

{
    "general": {
        "sessionId": "a2957207-e033-49e7-b9da-1c5f946a1074",
        "os": "android",
        "vendor": "htc"
    },
    "data": [
        {
            "target": "logPageVisits",
            "pageName": "users/packages",
            "engagementTime": 350
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

express-validator 只提供这样的验证:

req.checkBody('engagementTime')
        .notEmpty()
        .withMessage('Engagement-Time is required')
Run Code Online (Sandbox Code Playgroud)

似乎没有干净的方法来验证这样的嵌套对象:

req.checkBody('data.engagementTime')
        .notEmpty()
        .withMessage('Engagement-Time is required')
Run Code Online (Sandbox Code Playgroud)

我在Github上发现了一个已关闭的问题!但它不能满足我的担忧!

有什么更好的建议吗?

Gry*_*ets 2

您始终可以为 Express 创建自定义中间件
例如,在您的情况下,非常简单,它看起来像这样:

const checkNestedBodyMiddleware = (req, res, next) => {
  const { data } = req.body;

  // As I see, here is array in data, so we use simple find
  const engTimeInArr = data.find(d => d.engagementTime);

  if(!engTimeInArr){
    return res.status(400).send('Engagement-Time is required');
  }

  next();
}
Run Code Online (Sandbox Code Playgroud)

然后在您的路线中使用它:

app.post('/some-route', checkNestedBodyMiddleware, (req, res) => {
   // your route logic here.
})
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您可以将验证逻辑隐藏在中间件中,并且可以分配任意数量的中间件进行路由。