我的缓冲区格式在尝试从MongoDB数据库中检索时正在被更改,我不确定该过程的哪一步正在改变它。
我将mongoose模式定义为缓冲区:
var mealSchema = mongoose.Schema({
picture: Buffer,
它看起来像我在数据库中所期望的,一个普通的缓冲区:
{ "_id" : ObjectId("5691d1f73131c0db2b056447"), "picture" : BinData(0,"/9j/4TcORXhpZgAASUkqAKw2AA....
这是我用来将缓冲区发送回客户端的代码:
findAllMeals({})
.then(function(meals) {
res.send(200, meals);
这是客户端收回的方式:
Object {type: "Buffer", data: Array[86690]}
[0 … 9999]
[10000 … 19999]
[20000 … 29999]
[30000 … 39999]
[40000 … 49999]
[50000 … 59999]
[60000 … 69999]
[70000 … 79999]
[80000 … 86689]
length: 86690
它成为一个数组数组,它被存储为缓冲区,并被发送回嵌套数组。 我也尝试将它转换为角度的base64,看它是否会转换它,它没有。 我将架构中的存储数据类型更改为字符串,它没有改变任何内容,我没有想到更改为排除故障的其他内容。
答案 0 :(得分:0)
它不是一个数组数组,它是一个带有大数据数组的Buffer对象(console.log将其拆分以简化日志记录)。一种解决方案是排除图片,然后有不同的路线来获取特定餐点的图片(因为express can deal with buffers automatically):
// first route, exclude pictures
app.get('/meals', function(req, res, next) {
findAllMeals({}, {
picture: 0
})
.then(function(meals) {
res.send(200, meals);
});
});
// second route to fetch the picture of a meal
app.get('/meal_picture/:mealId', function(req, res, next) {
findOneMeal({
_id: req.params.mealId
}).then(function(meal) {
res.status(200).send(meal.picture);
});
});
然后,在你的html中,你可以简单地写:
<img src='/meal_picture/5691d1f73131c0db2b056447'></img>
旁注,res.send(200, meals)
已弃用,请使用res.status(200).send(meals)
。
答案 1 :(得分:0)
所以我通过将架构中的数据类型更改为
来实现它picture: {data: Buffer, contentType: String},
然后在客户端我转换了基础
<img ng-src="data:image/JPEG;base64,{{meal.picture}}"/>
我设法将所有内容保存在同一个REST请求中!