2016-08-28 2 views
0

내 seed 파일이 내 MongoDB에 2 명의 사용자를 시드해야합니다. 내 db.User.remove()은 확실히 db에있는 기존 사용자를 삭제하므로 올바른 db에 액세스하고 있습니다. 그러나 newUser.save()은 실제로 레코드를 저장하지 않습니다.Mongoose .create()가 db에 항목을 저장하지 않습니다

내 console.log에서 user_list의 내 2 사용자 객체가 생성되었지만 newUser.save()가 실제로 사용자 컬렉션에 새 레코드를 저장하지 않고 있습니다 (완전히 비어 있음). 어떤 아이디어?

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

참고 : [비동기 자바 스크립트의주기 (https://stackoverflow.com/questions/4288759/ 비동기 - 사이클 - 인 - 자바 스크립트) –

+0

좋은! 위대한 컨텍스트. 감사. –

답변

1

save 비동기 동작 (비 차단)이며,이 결과, 이전 process.exit();는 다음 저장 조작이 실행된다. user_list은 정적 데이터가있는 배열로 보입니다. 대신 users 변수 또는 모든 마커를 save 콜백에 기록하십시오.

해결 방법은 save 콜백에서 마지막 사용자에 대한 약속 또는 집계 검사를 집계하여 사용하는 것입니다.

+0

사실, 해결책을 찾았습니다. 이것은 나를 올바른 길로 인도한다. 감사! –

0

Konstantin이 언급했듯이 process.exit()가 저장되기 전에 호출되었습니다. 이 더 나은 솔루션이 있지만 대답은 간단 카운터를 추가하여 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

예, 종료하지 않고 멈 춥니 다. 내 생각에, count 반복은 저장 콜백 (save가 이미 실행 된)까지 일어나지 않기 때문에 process.exit()는 2 회 저장 후 (또는 많은 user_list가 길 때까지) 무시 될 때까지 무시된다. 더 깨끗한 솔루션을 알고 계십니까? –

+0

그래, 내가 대답에서 언급했듯이, 당신은'save' 콜백 안에서 방금 생성했는지 확인해야합니다. –

관련 문제