2016-09-28 4 views
0

저는 여전히 SQL 모드에서 벗어나려고 노력하고 있습니다. 이는 구현상의 문제가 아니라 건축적인 문제 일 수 있습니다. 내가 성취하려고하는 기능을 성취하기 위해몽구스 모델은 배열없이 절약합니다.

사용자를위한 스키마가 있습니다. 번거롭지 않게 mongoose를 사용하여 사용자를 mongoDB에 저장합니다.

그러나 우리는 스키마 모델을 입력 할 수있는 새로운 속성이 있습니다.이를 성과라고하며 다른 스키마에서 얻은 업적의 배열입니다. 다음과 같이이 사용자의 스키마에 선언 :

UserSchema.save에
var UserSchema = new Schema({ 
    _id    : { type: String, unique: true }, 
    group_id   : { type: String, required: true }, 
    username   : { type: String, required: true }, 
    achievements  : { type: Array } 
}); 

, 나는 같은 group_id 일치 성과의 배열을 얻을 수있는 성과 모델을 찾고, 다음과 같이

exports.create = function(req, res, next) { 
    var newUser = new User(req.body); 

    // Populate the achievements (same group_id) 
    Achievement.find() 
    .where({ group_id: newUser.group_id }) 
    .select({ _id: 1 }) 
    .exec() 
    .then(function(achievementsForGroupArray) { 

     _.forEach(achievementsForGroupArray, function(achievementForGroup) { 
     newUser.achievements.push(achievementForGroup); 
     }); 
    }) 
    .catch(function(err) { 
     return res.status(400).send(err).end(); 
    }) 

    newUser.save(function(err, user) { 
    // .. generic validation stuff .. 
    } 

이제 위의 경우 forEach()을 반환 배열의 직선 푸시로 바꾸더라도 작동하지 않으며 단순히 푸시를 'test'을 눌러 채우기 만해도 여전히 채워지지 않습니다.

내가 console.log newUser 저장하기 전에, 그들은 거기에 있습니다. 내가 console.log에 user 부분에 newUser.save(function(err, user)의 업적이 없다.

내 스키마 설정이 잘못되어 있으므로 Mongoose/MongoDB가 올바른 유형이 아니기 때문에 Mogoose/MongoDB가 삭제됩니다.

EDIT : 콘솔에 로그 할 때 결과가 나타나며 foreach 내부에서 볼 수 있습니다.

+0

여기에 "achievementsForGroupArray"개체를 배치 할 수 있습니까? –

답변

1

비동기 동작이 발생합니다. newUser.save 메서드를 "블록"안에 넣으십시오 (forEach 이후)

exports.create = function(req, res, next) { 
    var newUser = new User(req.body); 

    // Populate the achievements (same group_id) 
    Achievement.find() 
    .where({ group_id: newUser.group_id }) 
    .select({ _id: 1 }) 
    .exec() 
    .then(function(achievementsForGroupArray) { 

     _.forEach(achievementsForGroupArray, function(achievementForGroup) { 
     newUser.achievements.push(achievementForGroup); 
     }); 
**newUser.save(function(err, user) { 
    // .. generic validation stuff .. 
    })** 
    }) 
    .catch(function(err) { 
     return res.status(400).send(err).end(); 
    }) 
+0

아, 본질적으로'.then()'안에 끝나기 전에 저장하고 있습니까? – Aleski

+0

맞아요. 그 시간에 .then() 밖에 저장하면 비동기 동작으로 인해 아직 초기화되지 않았습니다. – Sachin

+0

건배 fam - 정렬되었습니다. – Aleski