Node.js Mongoose架构不保存在async.forEach循环内

Node.js Mongoose架构不保存在async.forEach循环内,node.js,asynchronous,mongoose,Node.js,Asynchronous,Mongoose,第一个帖子在这里,所以如果我弄错了道歉 我正在创建一些独立的代码来读取文件夹结构并返回数组中的所有.mp3文件。返回后,我在数组中循环,为每个项目创建一个Mongoose对象并填充字段,然后使用.save() 我使用async.forEach在数组中循环,虽然它确实循环了数组中的所有项,但它们并没有保存,并且不会产生任何错误来帮助我识别错误 如果我将循环的逻辑移到别处,那么MP3将存储在mongodb数据库中——如果我的示例显示没有保存任何内容 var saveMP3s = function(M

第一个帖子在这里,所以如果我弄错了道歉

我正在创建一些独立的代码来读取文件夹结构并返回数组中的所有
.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()

非常感谢您对我们的任何帮助

问候,, 标记
var saveMP3s=函数(MP3Files,回调){
log('start loop->saving mp3');
forEach(mp3文件,函数(mp3文件,回调){
var newTrack=new MP3Track();//已解决

我最终解决了这个问题,让异步循环在逻辑中处于更高的位置,因此saveMP3s函数是从异步循环本身中调用的

谢谢大家的想法和建议

享受你的一天

标记
(直到明天才允许接受我的答案,因此届时将更新问题状态)

好的,但是您是否在别处调用您的
saveMP3s
函数,并将其传递给回调函数?实际上,该函数可以是-异步循环中的回调没有超出该函数。问题在异步“循环”中。我想,如果我将其删除,它将保存第一个对象。这是否回答了您的问题完全不明白吗?:)我调用saveMP3s函数时使用“我调用函数时使用:saveMP3s(json)-json是多个项目,我想另存为“newTrack”,我很确定@AlexFord是对的。他看到了我们没有看到的东西。-缺少的变量(在编写时)在循环方面没有太大区别-我尝试过使用和不使用局部变量定义。我也尝试过在.save()之后使用callbacks(),函数,但不起作用。你有一个“理想的”异步循环吗?我已经尝试了这些示例,并且我的代码中的其他部分使用了与我使用的样式相同的样式。所以有点卡住了。很抱歉,你应该发布最后的代码。我很想看看你改变了什么。
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');
};