【问题标题】:Mongoose - Error: 'CastError: Cast to ObjectId failed for value "{ name: 'RandomName' }" at path "authors"'Mongoose - 错误:'CastError: Cast to ObjectId failed for value "{ name: 'RandomName' }" at path "authors"'
【发布时间】:2017-02-06 23:29:11
【问题描述】:

错误:
'CastError: Cast to ObjectId failed for value "{ name: 'RandomName' }" at path "authors"'

我正在使用邮递员对我拥有_id 的书发出放置请求。我正在发送一个带有名称键值对的正文:“whateverName”。

我们的目标是让书籍在一个数组中包含许多作者,在每本书的一个名为“作者”的属性上。

这是控制器。

app.put("/book/update/:id", function(req, res) { var author = req.body; Book.findOneAndUpdate({_id: req.params.id}, {$push: {authors: author}}, {new: true}, function(err, book) { if (err) { console.log(err); } else { console.log("author inserted"); res.status(200).send(); } }) })

这是作者架构。

```

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var AuthorSchema = new Schema({
  name: String
});

module.exports = mongoose.model("Author", AuthorSchema);

```

这是 Book 架构。

```

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var BookSchema = new Schema({
  title: String,
  author: String,
  category: String,
  authors: [{type: Schema.ObjectId, ref: "Author"}]
});

module.exports = mongoose.model("Book", BookSchema);

```

为什么我在休息日这么难熬?有人可以告诉我什么给了吗?我只是想使用参考将新作者(这是它自己的模型)推送到特定书籍。

非常感谢:)

【问题讨论】:

  • 在 BookSchema 字段中,“作者”是“Schema.ObjectId”的类型,但您传递的是字符串。这就是显示错误的原因
  • 应该看起来像 - authors: [AuthorSchema] 吗?

标签: javascript node.js mongodb mongoose database


【解决方案1】:

实际上,您将作者的 _id 存储在书籍作者数组中。 所以你需要像这样传递作者数据 [{array of _id's}]

app.put("/book/update/:id", function(req, res) {
  /***************************/
  var author = req.body; // array of _id (ObjectId)
  /***************************/
  Book.findOneAndUpdate({_id: req.params.id}, {$push: {authors: author}}, {new: true}, function(err, book) {
      if (err) {
        console.log(err);
      } else {
        console.log("author inserted");
        res.status(200).send();
      }
   })
})

【讨论】:

  • 但是我该怎么做呢?我什至不知道ID是什么......我打算当场创建作者......
  • 您已经有了作者列表对吧?当您创建一本书时,您正在将作者添加到该书籍部分,对吗?
  • 没有。我的作者为零。我打算在 BOOK 的展示页面上,在展示页面上,您可以在单个输入中输入作者姓名。每次提交时,都会在书中的“作者”数组中添加一个新的作者实例。
  • 我必须先创建作者实例吗?如果是这样...我将如何从图书展示页面这样做? IE。 1) 提交带有作者姓名的表单 2) 在控制器中,创建新书,然后 3) 向 findOneAndUpdate 发送一个承诺以更新书并将新作者的 id 推入?我将如何在控制器中做到这一点?
  • 好的,那么您需要先将作者数据保存在“作者”集合中,然后从响应中获取_id。使用该 _id 将作者数据存储在“书”集合中
【解决方案2】:

解决方案:您必须首先创建 AUTHOR 实例,然后在该函数内部,使用作者的返回值查找一本书,并通过将新创建的作者的 id 推送到数组来更新它。

app.put("/book/update/:id", function(req, res) { Author.create(req.body, function(err, author) { Book.findOneAndUpdate({_id: req.params.id}, {$push: {authors: author._id}}, {upsert: true}, function(err, book) { if (err) { console.log(err); } else { console.log("author inserted"); res.status(200).send(); } }) }) })

【讨论】:

  • 但最好的方法是先创建作者。即,为添加新作者维护一个单独的页面。然后在列表中添加书籍部分,您可以添加与书籍相关的作者。否则您将面临数据冗余。
  • 另一种情况,如果您想查找与特定作者相关的所有书籍。那么你的代码是不可能的。
  • 我编辑了我的答案,解决了上述所有评论问题
猜你喜欢
  • 2017-08-14
  • 2017-03-23
  • 2013-02-03
  • 2020-12-10
  • 1970-01-01
  • 2022-06-14
  • 2021-04-20
  • 1970-01-01
相关资源
最近更新 更多