Node.js 猫鼬不';报告正在保存的数据时,不保存数据
我在使用mongoose将一些数据保存到Mongo时遇到问题 在我的数据库模块中,我正在做:Node.js 猫鼬不';报告正在保存的数据时,不保存数据,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我在使用mongoose将一些数据保存到Mongo时遇到问题 在我的数据库模块中,我正在做: self.addMove = function (gameId, move, callback) { Game.findById(gameId, function (err, game) { if (err) callback(err); else { game.newMove = move; //apply new move
self.addMove = function (gameId, move, callback) {
Game.findById(gameId, function (err, game) {
if (err)
callback(err);
else {
game.newMove = move; //apply new move
game.save(Game.transformState(callback)); //save the game
}
});
};
其中newMove在GameSchema中定义为虚拟方法
GameSchema.virtual('newMove').set(function (move) {
if (move.player !== move.piece[0])
return;
if (allowedMove(move)) { //if piece is allowed to move
var from = positionToIndex(move.from),
to = positionToIndex(move.to);
this._field[to] = this._field[from]; //move it
this._field[from] = "";
}
});
将状态转换为静态方法
GameSchema.statics.transformState = function (callback) {
return function (err, data) {
if (err)
callback(err);
else
callback(null, {
_id: data._id,
moves: data.moves,
field: data.field //data.field transforms 1D array into 2D client-useable array
});
};
};
我如何称呼addMove:
socket.on('addMove', function (msg) {
console.log('New move: ' + msg);
var msg = JSON.parse(msg);
db.addMove(msg._id, msg.move, function (err, data) {
if(!err)
io.emit('getState', JSON.stringify(data));
});
});
根据要求,我的游戏模式:
GameSchema = new Schema({
moves: [MoveSchema],
_field: {
type: [String],
default: ["WR", "WN", "WB", "WQ", "WK", "WB", "WN", "WR", "WP", "WP", "WP", "WP", "WP", "WP", "WP", "WP", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "BP", "BP", "BP", "BP", "BP", "BP", "BP", "BP", "BR", "BN", "BB", "BQ", "BK", "BB", "BN", "BR"]
}
})
作为奖励,这是我第二次请求游戏状态的方式:
//sockets.js
socket.on('getState', function (msg) {
console.log('User requested game state!');
var msg = JSON.parse(msg);
db.getGame(msg._id, function (err, data) {
if(!err)
io.emit('getState', JSON.stringify(data));
});
});
//database.js
self.getGame = function (id, callback) {
Game.findById(id, Game.transformState(callback));
};
正如你们所看到的,每次我从客户端得到新的移动,我都会修改当前的游戏区域并保存那个游戏。当我用
game.save(game.transformState(callback))保存它时代码>它是“保存”的,这意味着回调中的数据是正确的。但是如果我再次尝试请求游戏状态,我可以看到它没有被保存。我还尝试手动检查MongoDB,但实际上没有保存。我想解释的是,在第行game.save(game.transformState(callback))代码>函数回调
在更新的游戏状态下执行,我可以在客户端看到它,但状态实际上没有保存在数据库中。显然,如果直接修改数组,mongoose不会检测到字段被更改。为了触发检测,我使用了this.markModified(“u字段”)代码>
我后来发现还有其他一些方法可以做到这一点:
我可能有误解,但您是否希望保存您的新招
虚拟版?因为虚拟化不会得到持久化,而且您缺少一些这个。与之相比,在方法中设置调用。什么是回调
?您如何调用addMove(…)
?@Tony是的,我希望能像(search for mad.name.full='Breaking Bad';)中看到的那样执行此操作,但它似乎不起作用。我只是尝试了你的建议,我交换了game.newMove=move代码>用于游戏设置('newMove',move)代码>和行为仍然相同。然后我试着把虚拟的全部放在一起,使用game.\u field[to]=game.\u field[from];游戏。_字段[从]=“”代码>但更改仍然没有保存。@Tony回调是我从sockets控制器方法传递给数据库方法的函数,它需要两个参数:(err,data)。我修改了OP,并在调用数据库方法的地方添加了代码。我添加了模式和一些额外的代码,如果您发现有任何错误。我试试你的建议。由于我没有使用本地mongoDB,compose.io是否可能有问题?我猜不是因为我可以更新其他文档,而是为了让你知道……我想出来了,检查我的答案。:)当我看到你的模式时,我就知道了。