在populate mongoose中,是否有可能将缓冲区转换为base64字符串?

3

我有一个以下的mongoose图像模式:

const ImageSchema = new mongoose.Schema({
    img:
    {
        data: Buffer,
        contentType: String
    }
})

mongoose.model('Image',ImageSchema)

并且有一个章节模式

const chapterSchema = new mongoose.Schema({
        chapter_no:{ type: Number, min: 0, max: 50 },
        published:Boolean,
        u_img:{type:mongoose.Schema.Types.ObjectId, ref:"Image"}
        
})
mongoose.model('Chapter', chapterSchema)

我将对图像进行人口统计。

Chapter.find()
    .populate({
        path:"u_img",
        select:["img"]
    })

    .exec(function(err,chapters){
        if(err) res.send(err)
        res.send(chapters)
    })

我正在尝试将章节中每个图像的缓冲区转换为base64字符串。有没有办法在mongoose的populate函数中执行转换?还是我必须在exec函数内部进行映射和转换?或者还有其他方法吗?

1个回答

3

关于populate区域,更多是关于将相关文档(在您的情况下是给定章节的图像)进行拼接,而不是将这些文档塑造成可用状态。

尽管如此,你可能会觉得这个选项很有用(在Mongoose 5.12中引入):

[options.transform=null] «Function» Mongoose会调用的函数,允许您转换填充的每个文档。

因此,您可以像这样修改您的查询:

Chapter.find()
  .populate({
    path:"u_img",
    select:["img"],
    options: {
      transform: doc => new Buffer(doc.data).toString('base64')
    }
  })

作为替代方案,您可以在exec函数中对拼合实体进行如下转换:
.exec(function(err, chapters){
  if(err) res.send(err)
  chapters.forEach(chapter => { 
    chapter.img = new Buffer(chapter.img.data).toString('base64');
  });
  res.send(chapters)
})

...基本上是按照这里提供的说明进行操作。


转换函数完美地运行了!非常感谢。我只需要将缓冲区的参数指定为doc.img.data。非常感谢! - pixy
添加一条注释:不能在子文档上应用转换。 - pixy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接