2016-06-08 78 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)當你需要傳遞一個回調函數時,然後指定該回調函數將該變量賦予該變量。

事情是這樣的:

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

我會建議更換你改變,你需要從用戶到用戶模型中的變量名。

你可以看到我傳遞的回調函數有一個錯誤對象和一個用戶對象,最後一個是你的信息被存儲的地方,來自db的對象,所以你應該把它的值賦給變量希望在這種情況下a_1。

請告訴我它是否成功!

+0

這限制了我的A_1在函數中,使我無法使用它的外函數(err,user){// code and var goes here}。 我想揭示它到我的updateRating函數,與收視率一起工作並在那裏更新它們。 –

+0

您需要在外部聲明變量。 –

-1

好的,似乎我在嘗試這個問題時有很多錯誤的想法。

主要問題是,我沒有考慮到所有的db查詢運行異步,這導致了一個巨大的麻煩。

現在選項A是將它們全部嵌套在一起,最終形成一個龐大的代碼blob /意大利麪,而不是真正的粉絲。特別是因爲如果我想繼續在這個應用程序上寫作,這不是很好。

所以要選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; 
}