【问题标题】:Is it possible to convert a buffer to base64string in populate mongoose?是否可以在填充猫鼬中将缓冲区转换为 base64string?
【发布时间】: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 中映射并进行转换?还是有其他方法?

【问题讨论】:

    标签: javascript node.js express mongoose mongoose-populate


    【解决方案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 非常感谢!
    • 添加注释:不能对子文档应用转换
    猜你喜欢
    • 2015-05-19
    • 2022-10-07
    • 2020-05-09
    • 2017-03-13
    • 2015-10-22
    • 2023-03-02
    • 2021-01-14
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多