2015-09-27 4 views
1

Вот мои настройки:Mongoose не может сохранить() в Socket.io вызова

app.js

io.on('connection', function(socket) { 
    socket.on('game-save-comment', function(data) { 
    var result = require('./sockets/games.js')(data); 
    if (result) { socket.emit('comment-ok'); } 
    else { socket.emit('comment-not-ok'); } 
    }); 
}); 

./sockets/games.js

var Game = require('mongoose').model('Game'); 

module.exports = function(data) { 
    var gid = data.gid; 
    var index = data.move; 
    var comment = data.comment; 

    return game = Game.findOne({gid: gid}, function(err, game) { 
     if (!game || err) { 
      return result = false; 
     } else { 
      game.comments[index] = comment; 
      return result = game.save(function(err) { 
       if (err) { 
        return false; 
       } else { 
        return true; 
       } 
      }); 
     } 
    }); 
} 

Думаю, я могу столкнуться с каким-то гоночным состоянием, но я не уверен. Я разместил console.log сообщений в разных местах этого кода и вызвал его. Поток попадает в функцию save() и возвращает true все время вверх ... однако документ никогда не обновляется в базе данных.

Я что-то не так? Все, что я хочу сделать, это обновить массив comments по указанному индексу.

+0

Это решило мою проблему: http://stackoverflow.com/questions/19165571/updating-a-subfield-in-a-mongodb-document -при-findone-и-сохранить – n0pe

ответ

2

У вас неправильный код, вам нужно добавить обратный вызов к экспортированным аргументам функции и вызвать обратный вызов после сохранения. Что-то вроде этого:

var Game = require('mongoose').model('Game'); 

module.exports = function(data, cb) { 
    var gid = data.gid; 
    var index = data.move; 
    var comment = data.comment; 

    Game.findOne({gid: gid}, function(err, game) { 
     if (!game || err) { 
      cb(err || "Game not found"); 
     } else { 
      game.comments[index] = comment; 
      game.save(cb); 
     } 
    }); 
} 

И здесь:

var games = require('./sockets/games.js'); 
games(data, function (err) { 
    if (err) { 
     socket.emit('comment-not-ok'); 
    } else { 
     socket.emit('comment-ok'); 
    } 
}); 
Смежные вопросы