mongodb - Mongoose 模式可选,带验证
问题描述
给定这样的架构:
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 = 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
,或者检查路由中字段的长度,如果它的长度大于指定的最大长度,您可以对其进行 substr,以免导致错误。
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");
}
});
推荐阅读
- typescript - 如何在嵌套 js 应用程序的服务文件中添加 DTO 源代码文件
- java - RSA Java:私钥不能用于加密
- java - 在 android studio 中同步出现问题:无法构建任何新项目
- windows-10 - ctags.exe & etags.exe 返回权限被拒绝
- java - 对图算法中的每条边都做浮点计算会不会非常低效
- java - UnMarshalException:意外元素
- mysql - mysql更新有几个连接
- python - keras SimpleRNN model data shape interpretation
- javascript - play,pause,resume operations on single button using speechSynthesisis not working
- typescript - 如何从父类返回子类的类型?