【问题标题】:Adding mongoose object to array in nodejs在nodejs中将猫鼬对象添加到数组中
【发布时间】:2017-12-22 03:47:40
【问题描述】:

我有一个这样的图像数组。

  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 });

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

【问题讨论】:

  • 发布完整的代码块

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

我敢打赌,您会在回调完成之前发送响应。

简单快速的修复:

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);
    }
  }
}

【讨论】:

  • 为什么我们不能将实际的图像对象添加到数组中?
  • @JunaidFarooq 我已经更新了我的答案,希望这能帮助你理解这个问题。
  • 在哪里添加和调用这个方法?
  • 你能指定,你有什么节点版本?或者您可以将其更新到最新版本?
  • v6.11.1 给你
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2019-03-28
    • 2015-09-10
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2021-05-06
    • 2022-08-17
    相关资源
    最近更新 更多