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

Posted

技术标签:

【中文标题】是否可以在填充猫鼬中将缓冲区转换为 base64string?【英文标题】:Is it possible to convert a buffer to base64string in populate mongoose? 【发布时间】:2021-09-03 21:17:07 【问题描述】:

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

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 中映射并进行转换?还是有其他方法?

【问题讨论】:

【参考方案1】:

嗯,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的收据。

【讨论】:

转换的效果很好!太感谢了。我只需要将 Buffer 的参数指定给 doc.img.data 非常感谢! 添加注释:不能对子文档应用转换

以上是关于是否可以在填充猫鼬中将缓冲区转换为 base64string?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++17 中将 std::string 转换为 std::vector<std::byte>?

如何在 node.js 中将位字符串转换为 base64?

如何在 Python 中将“托管缓冲区”转换为 Callable

在 Python 中将 PNG 转换为二进制(base 2)字符串

在 Javascript 中将 PDF 转换为 Base64 编码的字符串

如何在 Swift 3 中将 captureStillImageAsynchronously(sampleBuffer) 转换为 base64 编码