这是我的设置:
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'); }
});
});
./插座/ 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 :(得分: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');
}
});