是否可以在填充猫鼬中将缓冲区转换为 base64string?

问题描述

我有一个猫鼬图像架构如下:

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)
    })

我正在尝试将本章中每个图像的缓冲区转换为 base64string。 有人可以帮我吗?有没有办法在猫鼬中对填充函数进行转换?或者我必须在 exec func 中映射并进行转换?或者有其他方法吗?

解决方法

嗯,populate 关注的领域更多是将相关文档(在您的案例中为给定章节的图像)拼接在一起,而不是将这些文档按摩到某种可用状态。

不过,还有一个您可能会觉得有用的选项 (introduced in 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)
})

... 基本上按照给定 here 的收据。