2015-09-27 51 views
1

這裏是我的設置:貓鼬不能保存()的調用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'); 
    } 
});