首页 > 解决方案 > 验证不适用于猫鼬模式

问题描述

当我向我的数据库添加数据时,猫鼬没有验证我在 Schema 上定义的数据类型:

架构:

const mongoose = require("mongoose");

const Postschema = new mongoose.Schema({
  nome: {
    type: String,
    required: true,
    trim: true
  },
  email: {
    type: String,
    required: true,
    trim: true
  },
  morada: {
    type: String,
    required: true,
    trim: true
  }
});

const Post = mongoose.model('Post', Postschema);

module.exports = Post

功能:

const store = (req, res) => {
  const post = new Post({ nome: req.body.nome, email: req.body.email, morada: req.body.morada });
  post.save().then((post) => {
    res.status(201).json(post)
  }).catch((e) => res.status(500).json(e))
}

因此,即使我尝试使用数字而不是字符串创建和存储文档(如下所示),即使在我定义它必须是模式中的字符串并且对象以 wring 类型存储后它仍然有效数据。

{
    "nome": 1,
    "email":"Associado",
    "morada":"emailcomercial3@emailcomercial3.com"    
}

如您所见,nome 应该是一个字符串,但我可以将它作为整数添加到我的数据库中。我究竟做错了什么?

标签: node.jsmongodbexpressvalidationmongoose

解决方案


在这种情况下,nome 来自 的字段body被解释为字符串并Post创建文档。

如果您需要验证发布请求,您应该使用该express-validator库并定义一个自定义中间件来处理正文字段:

  1. 定义一个validator.js中间件:
const { body } = require('express-validator');

const validate = (method) => {
  switch (method) {
    case 'store': {
      return [
        body('nome')
          .not()
          .isEmpty()
          .withMessage('Nome is required')
          .not()
          .isNumeric()
          .withMessage('Nome should be a string')
          .trim()
          .escape(),
        body('email')
          .not()
          .isEmpty()
          .withMessage('E-mail is required')
          .isEmail()
          .withMessage('Insert a valid e-mail')
          .normalizeEmail(),
        body('morada')
          .not()
          .isEmpty()
          .withMessage('Morada is required')
          .trim()
          .escape(),
      ];
    }
    default:
      break;
  }
};

module.exports = { validate };
  1. validate函数store作为中间件添加到方法定义中:
const { validate } = require('./validator')

// Express router setup...

router.post('/url/to/post/store', validate('store'), store)
  1. 您可以store通过访问validationResult 函数来处理函数中的验证错误。如果出现错误,它将返回一个非空集。
const { validationResult } = require('express-validator');

const store = (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }

    ...
};

推荐阅读