给出这样的模式:
new Schema(
{
someData: {
someString: {
required: false,
maxlength: 400,
type: String
}
otherData: {
required: true,
type: String
}
});
someString
是可选的,但可以验证其长度是否小于400。
如果给我一个无效的长度字符串(> 400),该对象是否仍会保存但没有someString
还是会抛出错误?如果这引发错误,如何更改架构,以便仍然保存对象?
答案 0 :(得分:1)
它会在不保存文档的情况下引发错误。
假设我们有以下模式:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const studentSchema = new Schema({
someData: {
someString: {
required: false,
maxlength: 5,
type: String
},
otherData: {
required: true,
type: String
}
}
});
module.exports = mongoose.model("Student", 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
选项来解决此问题,或检查路径中字段的长度,如果该字段的长度大于指定的最大长度,则可以对其进行替换,以免导致错误
router.post("/students", async (req, res) => {
try {
let 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 = await Student.create(doc);
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");
}
});