如何应用具有引用的模型的验证?

How to apply validation of a Model which is having a ref?

我想对当前应用验证 schema.What 是我可以使用验证器进行验证并在未输入 projectMembers 时显示错误消息的方法吗?

projectMembers: [{
        user: {
            type: Schema.Types.ObjectId,
            ref: 'User',
            required: true,
        },
        userRole: {
            type: Schema.Types.ObjectId,
            ref: 'UserRole',
            required: true,
        },
    }],

用户模型

const userSchema = new Schema({
    username: {
        type: String,
        required: true,
        minlength: 3,
        validate: {
            validator: (username) => {
                return username.length >= 3
            },
            msg: () => {
                return 'UserName length less than 3 characters'
            }
        }
    },
    email: {
        type: String,
        required: true,
        unique: true,
        minlength: 7,
        validate: {
            validator: (email) => {
                return validator.isEmail(email)
            },
            msg: () => {
                return 'Enter a valid email'
            }
        }
    },
    password: {
        type: String,
        required: true,
        minlength: 8,
        validate: {
            validator: (password) => {
                return password.length >= 8
            }
        },
        msg: function () {
            return 'Enter atleast 8 charcters'
        }
    })

用户角色模型

const UserRoleSchema = new Schema({
    userRole: {
        type: String,
        required: true,
        validate: {
            validator: (userRole) => {
                return userRole.length >= 0
            },
            msg: () => {
                return 'User Role should be selected'
            }
        }
    }
})

const UserRole = mongoose.model('UserRole', UserRoleSchema)
module.exports = UserRole       

假设您的 projectMembers 在名为 Project 的模型中。

您可以像这样在架构中设置所需的错误消息:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const projectSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  projectMembers: [
    {
      user: {
        type: Schema.Types.ObjectId,
        ref: "User",
        required: [true, "User is required"]
      },
      userRole: {
        type: Schema.Types.ObjectId,
        ref: "UserRole",
        required: [true, "User Role is required"]
      }
    }
  ]
});

const Project = mongoose.model("Project", projectSchema);

module.exports = Project;

并且在post项目路由中,可以使用mongoose的doc.validateSync()方法进行验证

这是一个示例:

router.post("/project", async (req, res) => {
  const { name, projectMembers } = req.body;

  const project = new Project({ name, projectMembers });

  const { errors } = project.validateSync();

  if (errors) {
    let convertedErrors = [];
    for (field in errors) {
      convertedErrors.push(errors[field].message);
    }

    return res.send({ errors: convertedErrors });
  }

  //todo: do whatever you want

  res.send();
});

如果你发送一个没有用户角色的请求到这个正文的路由:

{
 "name": "project name",
 "projectMembers": [{
    "user": "5dc12a0aa875cd0ca8b871ea"
 }] 
}

您将收到以下回复:

{
    "errors": [
        "User Role is required"
    ]
}

并且如果您使用此正文将没有用户角色和用户的请求发送到此路由:

{
 "name": "project name",
 "projectMembers": [{}] 
}

您将收到以下回复:

{
    "errors": [
        "User Role is required",
        "User is required"
    ]
}