是否可以在 populate mongoose 中将缓冲区转换为 base64string?

Is it possible to convert a buffer to base64string in populate mongoose?

我有一个 mongoose Image Schema 如下:

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 字符串。 谁能帮帮我?有没有办法在猫鼬中对填充函数进行转换?或者我必须在 exec 函数中进行映射和转换?或者有其他方法吗?

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

还有一个选项可能对您有所帮助 (introduced in Mongoose 5.12):

[options.transform=null] «Function» Function that Mongoose will call on every populated document that allows you to transform the populated document.

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

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

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