问题描述
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 的收据。