【问题标题】:save a list of references in mongoose在猫鼬中保存参考列表
【发布时间】:2014-01-04 20:02:43
【问题描述】:

我有以下架构:

var TagSchema = new Schema({
  name: {
    type: String,
    default: ''
  }
});

var SnippetSchema = new Schema({
  title: {
    type: String,
    default: ''
  },

  tags: [{
    type: Schema.ObjectId,
    ref: 'Tag'
  }]
});

我创建一个新的代码片段并搜索一个标签(从请求中获取 tagid)以将其添加到标签列表中。

var snippet = new Snippet(req.body);

Tag.findById(req.body.tagid).exec(function(err, tag) {
  snippet.tags.push(tag);
  snippet.save(function(err) {
    if (err) {
    } else {
      res.json(snippet);
    }
  });
});

但我总是收到以下错误: 路径“tags”中的值“[object Object]”转换为 ObjectId 失败

我尝试了同样的事情,标签是一个标签数组中的一个标签——而且效果很好。

有人有想法吗?

非常感谢!

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    我很确定错误是由这一行引起的:

    var snippet = new Snippet(req.body);
    

    我的猜测是req.body.tags 是一个对象,而不是一个对象数组。当您随后保存 sn-p 时,将引发错误。

    作为一个快速修复,你可以用一个数组来包装它:

    var tags = req.body.tags;
    if (tags && tags.constructor.name !== 'Array') {
      req.body.tags = [ tags ];
    }
    var snippet = new Snippet(req.body);
    

    编辑:@damphat 正确评论说 Mongoose 将尝试将非数组值转换为数组,如果这是架构中定义的内容。但是,您仍然需要确保正在创建的数组是有效的。

    【讨论】:

    • 花一个小时,我从中学到了很多东西,但我仍然无法重现错误消息:)
    • Here is a gist 重现错误。我编辑了我的答案,因为从技术上讲,当您保存文档时会出现问题。
    • @damphat(抱歉,在之前的评论中忘记提及你了)
    • 啊,我只是 console.log(new Snippet({tags: "wrong value"}) 看到 {tag:[]}。无论如何,我认为您的快速修复与我的测试有误您应该检查标签是否为 24 十六进制而不是使其成为一个数组。因为 mongoose 会将 tags='1123456789012345678901234' 转换为 tags=[ObjectId('1123456789012345678901234')]
    • @damphat 好吧,最好的 解决方案是让req.body.tags 采用正确的格式 :) 这就是我称之为“快速修复”的原因:)跨度>
    猜你喜欢
    • 2015-01-14
    • 2018-12-30
    • 2013-01-25
    • 2015-08-08
    • 1970-01-01
    • 2015-03-16
    • 2019-07-14
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多