javascript - 更新 MongoDB 的路由和模型会删除数据或引发错误

标签 javascript mongodb express mongoose

我已经搜索了一段时间,但没有遇到类似我遇到的问题。

我正在开发一个具有四个路由的 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/

相关文章:

c# - DDD - 聚合根 - 处理效率和并发

javascript - 无法使用express加载静态文件

javascript - 为什么我的网站无法验证?

javascript - 我如何在 Ant 构建中使用 UglifyJS?

ruby-on-rails - NoMethodError : undefined method `[]' for false:FalseClass

MongoDB : Indexes order and query order must match?

node.js - Express session 如何存储 OAuth 实例之类的东西?

node.js - Mongoose .js : Atomic update of nested properties?

javascript - 环回允许所有用户访问只有所有者才能看到的内容

javascript - 尝试显示存储在本地存储中的数组的值时,对象可能为空错误( typescript )