这里的第一篇文章,如果我弄错了,请道歉......
我正在创建一些独立代码来读取文件夹结构并返回数组中的所有.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()
非常感谢任何帮助。
此致 标记
答案 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
传递给匿名函数的回调参数。