我已经搜索了一段时间,但没有遇到类似我遇到的问题。
我正在开发一个具有四个路由的 MERN 堆栈应用程序。其中三个路线工作正常,但我的第四条路线和数据库模型给我带来了麻烦。
这是模型:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
let bucketListItem = new Schema({
itemOnList: { type: String, required: true },
status: { type: String, required: true },
dateCreated: { type: Date, default: Date.now },
completed: { type: Boolean, default: false }
});
module.exports = mongoose.model("bucketListItem",
bucketListItem);
这是我在 Postman 中用来测试更新功能的 JSON(我从 GET 请求复制它,这就是它具有 _id 和 __v 的原因):
{
"completed": true,
"_id": "5c8b05c701eb8007dceb3aaa",
"itemOnList": "Visit Venice",
"status": "btdt.",
"dateCreated": null,
"__v": 0
}
正如您在模型中看到的,我有四个字段,其中两个字段设置为“required: true”。当我尝试更新任何字段时,例如将 true 切换为 false 或将状态更改为不同的消息,我收到一条错误,指出这两个字段是必需的,即使所有字段都包含信息。
这是错误消息:
{
"error": {
"errors": {
"status": {
"message": "Path `status` is required.",
"name": "ValidatorError",
"properties": {
"message": "Path `status` is required.",
"type": "required",
"path": "status"
},
"kind": "required",
"path": "status"
},
"itemOnList": {
"message": "Path `itemOnList` is required.",
"name": "ValidatorError",
"properties": {
"message": "Path `itemOnList` is required.",
"type": "required",
"path": "itemOnList"
},
"kind": "required",
"path": "itemOnList"
}
},
"_message": "bucketListItem validation failed",
"message": "bucketListItem validation failed: status: Path `status` is required., itemOnList: Path `itemOnList` is required.",
"name": "ValidationError"
}
}
现在,我尝试从模型中取出“required: true”,并且我不再收到错误消息。
相反,该路由完全从数据库条目中删除信息,我收到如下内容:
{
"completed": false,
"_id": "5c8b05c701eb8007dceb3aaa",
"__v": 0,
"dateCreated": "null"
}
这是我的路线代码:
blRoutes.route("/update/:id").post(function(req, res) {
BucketListItem.findById(req.params.id, function(err,
bucketListItem) {
if (!bucketListItem) {
res.status(404).send("Data not found.");
} else {
bucketListItem.itemOnList = req.body.itemOnList;
bucketListItem.status = req.body.status;
bucketListItem.dateCreated = req.body.dateCreated;
bucketListItem.completed = req.body.completed;
bucketListItem
.save()
.then(bucketListItem => {
res.json("Updated.");
})
.catch(err => {
res.status(400).send({ error: err });
console.log(err);
});
}
});
});
app.use("/bucketList", blRoutes);
我一直在使用 Body Parser 和 CORS,以防万一读到这篇文章的人对此感到好奇:
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
我希望我没有以不清楚的方式表达这一点或遗漏任何内容。如果有,请告诉我。
提前感谢您的帮助!
更新:
所以我重构了(我希望这是正确的词)我的路线,现在看起来像这样:
blRoutes.route("/update/:id").post(function(req, res) {
BucketListItem.findOneAndUpdate({ _id: req.params.id }, req.body, {upsert: true, returnNewDocument: true})
.then(bucketListItem => res.json(bucketListItem))
.catch(err => res.status(404).send(err));
});
(其中显示 {upsert: true},我也尝试过 {new: true}。
我稍微重构了我的模型:
let bucketListItem = new Schema({
itemOnList: { type: String, required: true },
status: { type: String, required: true },
dateCreated: { type: Date, default: Date.now() },
completed: Boolean
});
我的所有其余代码保持不变。
当我运行此代码时会发生什么,我试图更改的文档,
{
"dateCreated": null,
"_id": "5c8b05c701eb8007dceb3aaa",
"completed": false,
"itemOnList": "Visit Venice",
"status": "Bought tickets.",
"__v": 0
}
返回完全相同。一切都不会改变。我正在尝试将其更改为:
{
"completed": true,
"_id": "5c8b05c701eb8007dceb3aaa",
"itemOnList": "Visit Venice",
"status": "btdt.",
"dateCreated": null,
"__v": 0
}
据我所知,我的路线代码是正确的,但我确信有一些我没有注意到的事情。 再次感谢您的帮助。
最佳答案
您可以使用此查询简单地更新文档:-
BucketListItem.findOneAndUpdate(
{ _id: req.params.id },
req.body,
{ new: true, upsert: true }
);
此外,您不必将字段的默认值指定为 false。只需将类型指定为 bool 值,而不是传递具有类型的对象。
let bucketListItem = new Schema({
itemOnList: { type: String, required: true },
status: { type: String, required: true },
dateCreated: { type: Date, default: Date.now },
completed: Boolean
});
关于javascript - 更新 MongoDB 的路由和模型会删除数据或引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174867/