Mongodb Mongoose模式可选,带有验证

Mongodb Mongoose模式可选,带有验证,mongodb,validation,mongoose,Mongodb,Validation,Mongoose,给定这样的模式: new Schema( { someData: { someString: { required: false, maxlength: 400, type: String } otherData: { required: true, type: String } }); someString是可

给定这样的模式:

new Schema(
    {
      someData: {
        someString: {
          required: false,
          maxlength: 400,
          type: String
        }
        otherData: {
          required: true,
          type: String
        }
});
someString
是可选的,但是有一个验证来检查它的长度是否低于400


如果给我一个无效的长度字符串(>400),这个对象是否仍然被保存,但没有
someString
,或者这会引发错误?如果这引发了一个错误,我如何更改模式,使对象仍能保存

它将在不保存文档的情况下抛出错误

假设我们有这个模式:

const mongoose=require(“mongoose”);
const Schema=mongoose.Schema;
const studentSchema=新模式({
一些数据:{
someString:{
必填项:false,
最大长度:5,
类型:字符串
},
其他数据:{
要求:正确,
类型:字符串
}
}
});
module.exports=mongoose.model(“学生”,studentSchema);
这条邮路是:

const Student = require("../models/student");

router.post("/students", async (req, res) => {
  try {
    const result = await Student.create(req.body);
    res.send(result);
  } catch (err) {
    console.log(err);

    if (err.name === "ValidationError") {
      return res.status(400).send(err.errors);
    }
    res.status(500).send("Something went wrong");
  }
});
当我们发送一个错误的请求时,它将提供ValidationError,我们可以从
err.errors
读取错误详细信息

请求机构:

{
  "someData": {
    "someString": "123456",
    "otherData": "other"
  }
}
答复将是:

{
    "someData.someString": {
        "message": "Path `someData.someString` (`123456`) is longer than the maximum allowed length (5).",
        "name": "ValidatorError",
        "properties": {
            "message": "Path `someData.someString` (`123456`) is longer than the maximum allowed length (5).",
            "type": "maxlength",
            "maxlength": 5,
            "path": "someData.someString",
            "value": "123456"
        },
        "kind": "maxlength",
        "path": "someData.someString",
        "value": "123456"
    }
}
您可以通过删除
maxlength
选项来解决此问题,或者检查路由中字段的长度,如果字段的长度大于指定的maxlength,则可以对其进行substr,以便不会导致错误

router.post(“/students”),异步(req,res)=>{
试一试{
让doc=req.body;
if(doc.someData&&doc.someData.someString&&doc.someData.someString.length>5){
doc.someData.someString=doc.someData.someString.substring(0,5);
}
const result=等待学生创建(doc);
res.send(结果);
}捕捉(错误){
控制台日志(err);
如果(err.name==“ValidationError”){
返回res.status(400).send(err.errors);
}
res.status(500)。发送(“出错”);
}
});

有没有办法让它真正成为可选的?如中所示-如果验证失败,它仍然是可选的保存其余内容?@K41F4r我想可能有某种方法,顺便问一下,为什么您只删除
maxlength
otion?一方面-我想限制此字段的输入,另一方面,我只需要它,如果它是可用的,并且不会占用太多的空间db@K41F4r如果字段的长度超过maxlength,您可以对其进行substr,这样就不会发生错误,并且也会保存该字段。@K41F4r我更新了答案,以显示如果字段超过maxlength,如何对其进行substr。我想这是最好的办法。您可以将maxlength的值放入一个公共文件中,并在模式和路由中使用它,以便易于管理。