Mongoose模式不会保存在async.forEach循环中

时间:2014-05-05 14:24:36

标签: node.js asynchronous mongoose

这里的第一篇文章,如果我弄错了,请道歉......

我正在创建一些独立代码来读取文件夹结构并返回数组中的所有.mp3个文件。返回后,我循环遍历数组,对于每个项目,我创建一个Mongoose对象并填充字段,然后使用.save()保存对象

我使用async.forEach循环遍历数组 - 虽然它确实循环遍历数组中的所有项目但它们没有保存,并且没有产生错误来帮助我识别错误。

如果我将循环的逻辑移到别处,那么MP3就会存储在mongodb数据库中 - 如果我有示例显示没有保存。

var saveMP3s = function(MP3Files, callback) {
  console.log('start loop -> saving MP3s');
  async.forEach( MP3Files, function(mp3file, callback) {
    newTrack = new MP3Track();
    newTrack.title = mp3file.title;
    newTrack.track = mp3file.track;
    newTrack.disk = mp3file.disk;
    newTrack.metadata = mp3file.metadata;
    newTrack.path = mp3file.path;
    console.log('....:> Song Start: ');
    console.log(newTrack.title);
    console.log(newTrack.track);
    console.log(newTrack.disk);
    console.log(newTrack.metadata);
    console.log(newTrack.path);
    console.log('....:> Song End: ');
    newTrack.save(function (err) {
      if (err) {
        console.log(err);
      } else {
        console.log('saving Track: '+ newTrack.title);
        callback();
      }
    });
  }, function(err) {
    if (err) { console.log(err); }
  });
  console.log('end loop -> finished saving MP3s');
};

我遇到的问题是,当代码不在异步循环中时,代码可以工作,而MP3保存在MongoDB数据库中,在异步代码中没有任何内容被保存,并且没有给出错误原因。

我曾尝试(在代码的早期版本中)在读取MP3文件的元数据后创建对象 - 但由于某种原因,它不会保存列表中的最后2个对象(12个)。所以我先重新编写它来扫描所有项目,然后使用阵列中的mongoose填充mongoDB;只是为了分手。但是没有好运找出为什么没有发生任何事情以及为什么.save()

没有错误

非常感谢任何帮助。

此致 标记

2 个答案:

答案 0 :(得分:1)

解决

您好,

我最终通过将异步循环放在逻辑中更高的位置来解决它,因此从异步循环本身中调用了saveMP3s函数。

谢谢大家的意见和建议。

享受你的一天。

标记 (不允许在明天之前接受我的回答,因此会更新问题状态)

答案 1 :(得分:0)

var saveMP3s = function(MP3Files, callback) {
  console.log('start loop -> saving MP3s');
  async.forEach( MP3Files, function(mp3file, callback) {
    var newTrack = new MP3Track(); // <--- USE VAR HERE
    newTrack.title = mp3file.title;
    newTrack.track = mp3file.track;
    newTrack.disk = mp3file.disk;
    newTrack.metadata = mp3file.metadata;
    newTrack.path = mp3file.path;
    console.log('....:> Song Start: ');
    console.log(newTrack.title);
    console.log(newTrack.track);
    console.log(newTrack.disk);
    console.log(newTrack.metadata);
    console.log(newTrack.path);
    console.log('....:> Song End: ');
    newTrack.save(function (err) {
      if (err) {
        console.log(err);
      } else {
        console.log('saving Track: '+ newTrack.title);
        callback();
      }
    });
  }, function(err) {
    if (err) { console.log(err); }
  });
  console.log('end loop -> finished saving MP3s');
};

我怀疑丢失的var关键字声明了一个全局变量,并且在循环的每次迭代中都会覆盖它。意思是,在第一个newTrack完成它的异步保存操作之前,你已经在循环中移动并用下一个实例覆盖该变量。

此外,在async.forEach中,MUST在操作完成时调用回调。如果记录成功保存,您只需调用它。如果发生错误,您也应该调用它并传入错误。

最后,callback函数的saveMP3s参数根本不会被调用。 callback()函数内对newTrack.save的调用仅引用async.forEach传递给匿名函数的回调参数。