2016-06-08 3 views
0

좋아, 나는이 코드를 50 가지 방법으로 시도한 후에 머리를 치고있다.FindOne mongoose nodejs의 반환 값

그래서 저는 2v2로 재생되는 샘플 게임을 가지고 있습니다. 모든 게임 스키마에서 플레이어는 사용자와 사용자 이름으로 참조됩니다.

이제 게임에서이 사용자들의 평점을 받아 적절하게 업데이트하고 싶습니다. 동시에 발생해야합니다.

오랫동안 Java에서 왔기 때문에 내 사용자 객체에 손이 닿지 않는 것 같습니다. 그래서이 중 일부는 바로 이해할 수 없습니다.

가능한 경우이 코드를 확장하고 싶습니다. 그래서 거대한 중첩 된 코드는 제가 찾고있는 것이 아닙니다. 더 나면 뭐라고없이

:

gameSchema :

var gameSchema = mongoose.Schema({ 
    teamA_player1:  { type: String, ref: "userModel", required: true}, 
    teamA_player2:  { type: String, ref: "userModel", required: true}, 
    teamB_player1:  { type: String, ref: "userModel", required: true}, 
    teamB_player2:  { type: String, ref: "userModel", required: true}, 
    teamA_score:  { type: Number, required: true}, 
    teamB_score:  { type: Number, required: true}, 
    author:    { type: String, ref: "userModel", required: true}, 
    verification:  [{ type: String, ref: "userModel", required: true}], 
    verified:   { type: Boolean}, 
    timestamp:   { type: Date} 
}); 

userSchema :

var userSchema = mongoose.Schema({ 
    username:  { type: String, required: true, unique: true}, 
    password:  { type: String, required: true}, 
    firstName:  { type: String}, 
    lastName:  { type: String}, 
    about:   { type: String}, 
    email:   { type: String}, 
    clubs:   { type: [{type: ObjectId, ref: "clubModel"}]}, 
    games:   { type: [{type: ObjectId, ref: "gameModel"}]}, 
    rating:   { type: Number} 
}); 

내 gameController에 내 코드와 문제 : 그러니까 기본적으로 나는 '

updateRating = function(game){ 

    // The following code blob doesn't work and calling a_1.rating just gives Nan/undefined. 
    var a_1 = users.findOne({username: game.teamA_player1}); 
    var a_2 = users.findOne({username: game.teamA_player2}); 
    var b_1 = users.findOne({username: game.teamB_player1}); 
    var b_2 = users.findOne({username: game.teamB_player2}); 

    var a_rating_old = (a_1.rating+a_2.rating)/2; 
    var b_rating_old = (b_1.rating+b_2.rating)/2; 

    var a_rating_new = 0; 
    var b_rating_new = 0; 

    if(game.teamA_score>game.teamB_score){ 
     a_rating_new = ratingChange(a_rating_old, b_rating_old, true); 
     b_rating_new = ratingChange(b_rating_old, a_rating_old, false); 
    }else{ 
     a_rating_new = ratingChange(a_rating_old, b_rating_old, false); 
     b_rating_new = ratingChange(b_rating_old, a_rating_old, true); 
    } 

    var a_rating_change = a_rating_new - a_rating_old; 
    var b_rating_change = b_rating_new - b_rating_old; 

    a_1.rating += Math.round(a_rating_change * (a_rating_old/a_1.rating)); 
    a_2.rating += Math.round(a_rating_change * (a_rating_old/a_2.rating)); 
    b_1.rating += Math.round(b_rating_change * (b_rating_old/b_1.rating)); 
    b_2.rating += Math.round(b_rating_change * (b_rating_old/b_2.rating)); 

    a_1.save(); 
    a_2.save(); 
    b_1.save(); 
    b_2.save(); 

} 

m w 여기에서 내 사용자를 얻고, 등급을 추출하고, 업데이트 한 다음 사용자에게 새 등급을 저장하는 올바른 방법을 제공하는 것입니다 (게임 자체는 변경되지 않습니다).

코드도 모두 여기에서 찾을 수 있습니다 : https://github.com/mathieudevos/pinkiponki

답변

0

것은 그래서 당신은 이미 당신이 다시 잘못하고 그 사용자 변수 일에서 모델을 필요 asuming 것은 당신이 변수 (예에 해당 기능을 할당하는 것입니다. a_1) reallity에서 콜백 함수를 전달한 다음 해당 콜백이 변수에 전달되는 사용자를 지정해야합니다. 이 같은

뭔가 :

user.findOne({username: game.teamA_player1}, function(err, user){ 
    if(err) throw err; 
    a_1 = user; 
}); 

난 당신이 사용자에 대한 사용자의 모델을 필요로하는 변수의 이름을 변경 권 해드립니다 것입니다.

내가 전달하는 콜백 함수에는 오류 개체와 사용자 개체가 있는데,이 마지막 것은 정보가 저장되는 곳, db의 개체이므로 변수에 값을 할당해야합니다. 이 경우에는 a_1이 필요합니다.

해결 되었으면 알려주세요.

+0

이 외부에서 사용할 날 수없는 만드는 함수 내에서 내 A_1을 제한 함수 (err, user) {// 코드와 var는 여기에있다}. 내 updateRating 함수에이를 공개하고 거기에서 등급을 사용하여 업데이트하려고합니다. –

+0

변수를 외부에 선언해야합니다. –

-1

좋아,이 문제를 시도하는 동안 나는 꽤 잘못된 생각을 갖고있는 것 같다.

주요 문제는 모든 db 쿼리가 비동기로 실행된다는 사실을 고려하지 않았기 때문에 번거로운 번거 로움이있었습니다.

이제 옵션 A는 모두 함께 중첩되어 큰 코드 블롭/스파게티가되고 실제로는 그렇지 않습니다. 특히이 응용 프로그램에 계속 쓰고 싶다면 좋지 않습니다.옵션 B에 따라서

, 모듈 deasync를 설치하고 단지 #DealWithIt

다음과 같이 코드는 지금 :

var done = 0; 

var a_1; 
var a_2; 
var b_1; 
var b_2; 

users.findOne({username: game.teamA_player1}, function(err, usera1){ 
    if(usera1) 
     a_1 = usera1.rating; 
    done += 1; 
}); 
users.findOne({username: game.teamA_player2}, function(err, usera2){ 
    if(usera2) 
     a_2 = usera2.rating; 
    done += 1; 
}); 
users.findOne({username: game.teamB_player1}, function(err, userb1){ 
    if(userb1) 
     b_1 = userb1.rating; 
    done += 1; 
}); 
users.findOne({username: game.teamB_player2}, function(err, userb2){ 
    if(userb2) 
     b_2 = userb2.rating; 
    done += 1; 
}); 

//Keep looping on deasync until we find all 4 
require('deasync').loopWhile(function(){return (done!=4);}); 

if(a_1 == undefined || a_2 == undefined || b_1 == undefined || b_2 == undefined){ 
    // could not find a user probably 
    log('Value undefined, error'); 
    return; 
}