Mongoose - 更新时如何验证模型?

Posted

技术标签:

【中文标题】Mongoose - 更新时如何验证模型?【英文标题】:Mongoose - How to validate model when updating? 【发布时间】:2020-08-26 05:35:49 【问题描述】:

我有以下型号。当我尝试使用错误信息创建时,它不允许,但如果我尝试编辑信息,则允许它。我怎样才能防止这种情况发生?

var userSchema = new Schema(
  cartaoCidadao: 
    type: String,
    required: true,
    index: 
      unique: true,
    ,
    match: /[0-9]8/,
  ,
  password:  type: String, required: true ,
  histórico: [
    
      type: Schema.Types.ObjectId,
      ref: "Request",
    ,
  ],
  role:  type: String ,

  estado:  type: String, enum: ["Infetado", "Suspeito", "Curado"] ,

);

userController.updateUserPassword = async (req, res) => 
  const oldUser = await User.findByIdAndUpdate(req.params.userId, 
    password: req.body.password,
  );

  //nao permitir password vazia
  const newUser = await User.findById(req.params.userId);
  res.send(
    old: oldUser,
    new: newUser,
  );
;

userController.updateUserState = async (req, res) => 
  const oldUser = await User.findByIdAndUpdate(req.params.userId, 
    estado: req.body.estado,
  );

【问题讨论】:

【参考方案1】:

updateValidators默认关闭,需要在更新操作中指定runValidators: true选项。

userController.updateUserPassword = async (req, res) => 
  try 
    const oldUser = await User.findByIdAndUpdate(
      req.params.userId,
      
        password: req.body.password,
      ,
      
        runValidators: true,
      
    );

    //nao permitir password vazia
    const newUser = await User.findById(req.params.userId);
    res.send(
      old: oldUser,
      new: newUser,
    );
   catch (err) 
    console.log('Error: ', err);
    res.status(500).send('Something went wrong.');
  
;

【讨论】:

在哪里激活它? 我已经做到了,现在每当我尝试更新为无效密码时,邮递员只会停留在“发送请求”。假设会发生这种情况吗? @FábioPires 你能像我在更新的答案中那样添加一个 try catch 块,并检查 api 控制台是否有错误? 它起作用了。愚蠢的问题,与其发送出错信息,不如发送密码无效或者我应该避免向用户显示错误是什么? @FábioPires 是的,如果是验证错误会更好,检查我的答案here

以上是关于Mongoose - 更新时如何验证模型?的主要内容,如果未能解决你的问题,请参考以下文章

mongoose 模型连接到 mongoDB

mongoose 模型连接到 mongoDB

自动增加猫鼬模型中的数字字段

如何在 mongoose 和 mongodb 中更新嵌套模型

您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型

在更新使用 Mongoose 模型检索并作为承诺处理的文档时遇到问题