【问题标题】:Express-Validator Check array of SubdocumentsExpress-Validator 检查子文档数组
【发布时间】:2017-09-25 19:02:18
【问题描述】:

这是我的架构:

const InvoiceSchema = new Schema({
name: { type: String, required: true },
description: { type: String },

items: [{
    name: { type: String, required: true },
    rate: { type: Number, required: true },
    quantity: { type: Number, required:true, default: 1 },
    amount: { type: Number }
}]});

我想知道如何使用 Express-validator 来检查 items 元素?

【问题讨论】:

    标签: node.js validation express mongoose mongoose-schema


    【解决方案1】:

    之前也遇到过同样的问题,而且非常痛苦,尤其是当它需要验证一个深度数组或对象数组时。我最终创建了自己的验证器 (wallter) 来处理这个问题。而且这个工具可以直接从你的猫鼬模型生成验证模式。

    所以你上面的架构会生成一个验证架构:

    {
      "name": {
        "required": {
          "msg": "Value for field 'name' is required"
        }
      },
      "description": {
        "optional": true
      },
      "items.*.name": {
        "required": {
          "msg": "Value for field 'items.*.name' is required"
        }
      },
      "items.*.rate": {
        "required": {
          "msg": "Value for field 'items.*.rate' is required"
        },
        "isDecimal": {
          "msg": "Expecting 'decimal' value for field 'items.*.rate'"
        }
      },
      "items.*.quantity": {
        "required": {
          "msg": "Value for field 'items.*.quantity' is required"
        },
        "isDecimal": {
          "msg": "Expecting 'decimal' value for field 'items.*.quantity'"
        }
      },
      "items.*.amount": {
        "optional": true,
        "isDecimal": {
          "msg": "Expecting 'decimal' value for field 'items.*.amount'"
        }
      }
    }
    

    这个验证模式可以提供给验证器

    const halter = require('wallter').halter
    const Builder = require('wallter').builder // validation schema builder
    
    const builder = new Builder({
      model: mongoose.model('YourModelName')
    })
    
    server.use(halter())
    
    server.post('/test', function (req, res, next) {
        let validationSchema = builder.build() // see above generated validation schema output
    
        req.halt(validationSchema).then(result => {
            if (result.length) {
                res.send(400, result)
            } else {
                res.send(200)
            }
    
            return next()
        })
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 2019-09-12
      • 2016-09-29
      • 1970-01-01
      • 2020-08-25
      相关资源
      最近更新 更多