我试图在集合中执行一次性的数据迁移,并且我试图在返回的数组上使用带有forEach保存操作的find()。但是save()没有做(数据库中的集合没有更新)并且没有触发错误回调。 find()返回的数据有效。我错过了什么?
Patient.find().exec(function(err, patients) {
console.log('Data: ' + patients.length); // The patients array is valid
patients.forEach(function(patient) {
console.log(patient.name); // Prints valid data
patient.name = patient.name + ' (*)';
patient.save(function(err) {
console.err(err); // This callback is never called
process.exit(1);
});
});
process.exit(0);
});
答案 0 :(得分:1)
问题是最后调用process.exit(0)。我忘记了保存调用是异步的,最后的退出调用在排队的保存操作运行之前退出脚本。我重新构建了代码,以便只有在所有保存操作完成后脚本才会退出。现在我得到了正确的行为。如果有更好的方法来构建此代码,请分享。
Patient.find().exec(function(err, patients) {
console.log('Data: ' + patients.length);
var doneCount = 0;
patients.forEach(function(patient) {
patient.name = patient.name + ' (!)';
patient.save(function(err) {
if (err) {
console.log(errorHandler.getErrorMessage(err));
process.exit(1);
}
doneCount++;
console.log('Completed ' + doneCount + '/' + patients.length + ' updates');
if (doneCount == patients.length) {
console.log('Done!');
process.exit(0);
}
});
});
});