Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 猫鼬不';报告正在保存的数据时,不保存数据_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 猫鼬不';报告正在保存的数据时,不保存数据

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

我在使用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
        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是否可能有问题?我猜不是因为我可以更新其他文档,而是为了让你知道……我想出来了,检查我的答案。:)当我看到你的模式时,我就知道了。