2016-06-08 3 views
0

Хорошо, я ударяю головой, попробовав этот код 50 различными способами.Возвращаемое значение FindOne mongoose nodejs

Итак, у меня есть образец игры, в которую играют 2v2, в каждой игре Schema игроки ссылаются на пользователя и по имени пользователя.

Теперь в игре я хочу получить рейтинги от этих пользователей и обновить их соответственно, это должно произойти в одно и то же время.

Я, похоже, не могу получить доступ к своим пользовательским объектам (исходя из долгого времени 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; 
}); 

Я бы порекомендовал вам изменить имя переменной, в которой требуется модель от пользователя к пользователю.

Вы можете видеть, что функция обратного вызова, которую я передаю, имеет объект ошибки и пользовательский объект, это последняя, ​​где хранится ваша информация, объект из базы данных, поэтому вы должны назначить ее значение переменной, которую вы хотите, в этом случае a_1.

Скажите, пожалуйста, если это сработало!

+0

Это ограничивает мою a_1 в пределах функции, что делает меня неспособным использовать его вне функция (err, user) {// здесь код и var}. Я хочу показать его моей функции updateRating, работать с рейтингами там и обновлять их там. –

+0

Вам нужно будет объявить переменную снаружи. –

-1

Хорошо, кажется, у меня было немало неправильных идей при попытке этой проблемы.

Основная проблема заключается в том, что я не рассматривал тот факт, что все запросы db запускают async, что вызвало огромную проблему.

Теперь вариант A состоит в том, чтобы вложить все это вместе, и в итоге получается огромный код-blob/spaghetti, а не настоящий поклонник этого. Тем более, что это не очень приятно, если я хочу продолжить писать в этом приложении.

Так вариант б, установить модуль 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; 
} 
Смежные вопросы