2016-08-28 11 views
0

私のシードファイルは、私のMongoDBに2人のユーザをシードすることになっています。私のdb.User.remove()は間違いなく私のdbの既存のユーザーを削除しているので、私は右のdbにアクセスしています。ただし、newUser.save()は実際にレコードを保存していません。Mongoose .create()はdbへのエントリを保存しません

私のconsole.logはuser_listの私の2つのユーザオブジェクトが生成されたことを示していますが、newUser.save()は実際には新しいレコードをUserコレクションに保存していません。何か案は?

seed.js

// remove all users 
db.User.remove({}, function(err, users){ 
    if(err) { 
    console.log('Error occurred in remove', err); 
    } else { 
     console.log('removed all users'); 
     // create new records based on the array user_list 
     for (i=0; i < user_list.length; i++) { 
      var newUser = new User(); 
      // set the user's local credentials 
      newUser.email = user_list[i].email; 
      newUser.password = createHash(user_list[i].password); 
      newUser.company = user_list[i].company; 
      newUser.firstName = user_list[i].firstName; 
      newUser.lastName = user_list[i].lastName; 
      newUser.admin = user_list[i].admin; 
      console.log(newUser); 
      // save the user 
      newUser.save(function(err, users) { 
       if (err){ 
        console.log('Error in Saving user: '+ err); 
        throw err; 
       } 
      }); 
     } 
     console.log("created", user_list.length, "users"); 
     process.exit(); 
    } 
}); 
+0

注:[JavaScriptでのサイクルのための非同期](https://stackoverflow.com/questions/4288759/非同期 - サイクル - in-javascript) –

+0

ニース!素晴らしい文脈。ありがとう。 –

答えて

1

save動作は、非同期(非ブロッキング)、結果として、process.exit();操作を保存先に、次に実行されるです。 user_listは静的なデータを持つ配列のようです。代わりにusers変数または任意のマーカーをsaveコールバックに記録してみてください。

これを修正する方法は、saveコールバックで最後のユーザーの約束を集約して使用することです。

+0

実際には解決策が見つかりました。これは正しい軌道に乗った。ありがとう! –

0

コンスタンチンが述べたように、process.exit()はsaveの前に呼び出されていました。カウンタを追加することにより)があり、より良い解決策がありますが、簡単な答えは(process.exitを遅らせることだった:

// remove all users 
db.User.remove({}, function(err, users){ 
    if(err) { 
    console.log('Error occurred in remove', err); 
    } else { 
     console.log('removed all users'); 
     // create new records based on the array user_list 
     var count = 1; 
     for (i=0; i < user_list.length; i++) { 
      var newUser = new User(); 
      // set the user's local credentials 
      newUser.email = user_list[i].email; 
      newUser.password = createHash(user_list[i].password); 
      newUser.company = user_list[i].company; 
      newUser.firstName = user_list[i].firstName; 
      newUser.lastName = user_list[i].lastName; 
      newUser.admin = user_list[i].admin; 
      console.log(newUser); 
      // save the user 
      newUser.save(function(err, users) { 
       count += 1; 
       if (err){ 
        console.log('Error in Saving user: '+ err); 
        throw err; 
       } else if (count == user_list.length) { 
        process.exit(); 
       } 
      }); 
     } 
     console.log("created", user_list.length, "users"); 
    } 
}); 
+0

'process.exit()'なしでコードを実行しようとしましたか?現在のコードは遅れていないので、単にチェックを行い、失敗した場合は 'process.exit()'をスキップします。 –

+0

はい、終了せずにフリーズします。私は、セーブコールバック(saveはすでに実行されている)までカウントの反復が起こっていないので、process.exit()は2回のsave(またはuser_listの長さの長いsave)まで無視されます。よりクリーンなソリューションをご存じですか? –

+0

ええ、答えで述べたように、 'save'コールバックの中に作成したことを確認してください。 –

関連する問題