在nodejs

时间:2017-07-17 14:36:50

标签: javascript arrays node.js mongodb mongoose

我有一系列图像。

  var newImageParams = [
    {
      image_string: "hello",
      _type: "NORMAL"
    },
    {
      image_string: "hello",
      _type: "NORMAL"
    }
  ]

我正在使用mongo db和在nodejs中,我使用的是mongoose,一切都很好,我可以将数据添加到mongoose表中,但是在添加每个图像之后,我试图将生成的对象保存到一个数组中,在控制台中.log正在发生,也是正确的,但当我返回该数组时,其中没有任何内容并且它是空的

if (newImageParams) {
  for (var i = newImageParams.length - 1; i >= 0; i--) {
    // allImages[i]
    var newImage = new Image(Object.assign(newImageParams[i], {bike: bike._id}));
    newImage.save(function(err, image){
      console.log(image);
      allImages.push(image);
      console.log(allImages);
    });
  }
}

这就是我正在做的事情,一切都是正确的,在控制台上是好的,但是当我最终回归时,

res.json({bike: bike, images: allImages });

图像数组是完全空的,因为它是在声明时?为什么会这样,请帮忙

2 个答案:

答案 0 :(得分:2)

我打赌你在回调完成之前发送回复。

简单快速的解决方法:

if (newImageParams) {
  for (var i = newImageParams.length - 1; i >= 0; i--) {
    const image = Object.assign(newImageParams[i], {bike: bike._id});
    var newImage = new Image(image);
    allImages.push(image);
    newImage.save(function(err, image){
      console.log(image);
      console.log(allImages);
    });
  }
}

我将使用async / await添加正确的方法,旧版本将使用Promise.allasync.parallel

async function doJob() {
  if (newImageParams) {
    for (var i = newImageParams.length - 1; i >= 0; i--) {
      const image = Object.assign(newImageParams[i], {bike: bike._id});
      const newImage = new Image(image);      
      await newImage.save();
      allImages.push(image);
    }
  }
}

答案 1 :(得分:0)

allImages.push(image); - >那行代码是异步的。它将进入事件队列,您的控制台日志将立即调用。

所以console.log(allImages);将返回空。

您可以在here中阅读更多内容。它将来会帮助你。