为什么我的缓冲区自动转换为嵌套数组

时间:2016-01-10 23:43:49

标签: node.js mongodb mongoose buffer angular-fullstack

我的缓冲区格式在尝试从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,看它是否会转换它,它没有。 我将架构中的存储数据类型更改为字符串,它没有改变任何内容,我没有想到更改为排除故障的其他内容。

2 个答案:

答案 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请求中!