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的值放入一个公共文件中,并在模式和路由中使用它,以便易于管理。