找不到工作后的Mongoose保存(数据迁移脚本)

时间:2015-04-26 14:13:10

标签: node.js mongodb mongoose

我试图在集合中执行一次性的数据迁移,并且我试图在返回的数组上使用带有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);
});

1 个答案:

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