转换为ObjectId失败的值(对文件的引用)

时间:2018-04-12 22:50:48

标签: node.js mongodb mongoose gridfs

正如标题所说。

更多上下文:我有一个小脚本(由php通过exec启动),它将搜索具有给定id的章节,对图像进行一些更改(加扰它们),我没有设法做在php(我是新手使用文件)。

这是我的架构

//instantiate mongoose-gridfs
var gridfs = require('mongoose-gridfs')({
    collection:'files',
    mongooseConnection: mongoose.connection
});

//Files = gridfs.model;
var FilesSchema = gridfs.schema;

FilesSchema.add({
    _id: Schema.Types.ObjectId,
    name: String,
    mime: String,
    filename: String,
    type: String
});

Files = mongoose.model('Files', FilesSchema);

var pageSchema = Schema({
    order: Number,
    image: { type: Schema.Types.ObjectId, ref: 'Files' },
    scrambled: Boolean
});

var ChapterSchema = Schema({
    _id: Schema.Types.ObjectId,
    pages: [pageSchema]
});

var Chapter = mongoose.model('Chapter', ChapterSchema, "Chapter");

当我这样做时

Chapter.findById(chapterId)
        .populate('pages.image')
        exec(...

它引发了CastError:{ CastError: Cast to ObjectId failed for value "DBRef ... 错误对象很长,所以我不在这里粘贴它 但这是一个带有完整错误消息/对象

的pastebin
https://pastebin.com/8n54Dhzt

如果我是chan,ge是Image to Array的类型,我可以访问我需要的属性,但在这种情况下,我无法正确地重置图像(它在db而不是Ref上写入数组)< / p>

我的参考文献位于embeddedDocument中,就像那样

Chapter.pages[0].image

image是具有引用的属性。

我真的不明白为什么会出现这个错误,我按照参考/填充的文档进行了说明:http://mongoosejs.com/docs/populate.html

PS:一个重要的细节,参考文献由DoctrineODM保存。 我使用我的节点脚本来修改/加密图像,然后在我的应用程序中恢复js中的加密。

PS2:抱歉,如果已经发布并回答了类似的问题,那么有很多帖子都有相同的错误&#39; Cast to ObjectId的值为&#39;我承认我没有读过所有这些内容,但我读过的内容并没有帮助我。

编辑:更新我的代码以使用mongoose-gridfs模型而不是另一个+使用subDocument代替对象数组

1 个答案:

答案 0 :(得分:0)

这似乎是chapterId值的错误。使用collection.findById时,传递的值必须通过ObjectId条件

  1. 12字节结构,ObjectId的前4个字节代表 自UNIX纪元以来的秒数。
  2. ObjectId的后3个字节代表机器标识符。
  3. ObjectId的下两个字节表示进程ID。
  4. ObjectId的最后3个字节代表一个随机计数器 值。
  5. 如果你传递的id不能构造成上面描述的模式,那肯定会抛出像你一样的错误。

    因此,请确保chapterId正确或与您从数据库中获取的内容相同