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消息放在了这个代码的不同位置,并且触发了它。 stream进入save()函数,并一直返回true …但文档永远不会在数据库中得到更新。

难道我做错了什么? 我想要做的就是更新指定索引处的comments数组。

你没有正确的代码,你需要添加callback到导出的函数参数,并保存完成后调用callback。 像这样的东西:

 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'); } });