服务器上的正确variables通过socket.io作为不正确的variables传递给客户端

我试图通过socket.io从服务器传递给客户端的variables。 我将数据保存到MongoDB并使用Mongoose。 目标是将客户端的一些数据保存到数据库中,然后将刚刚保存的文档的_id传递回客户端。 以下是我到目前为止:

服务器

client.on('savesnail', function (data) { console.log('save snail: ' + data.name); var snail = new Snail(data); snail.save(function (err, snail) { if (err) {console.log('err: ' + err)} // TODO handle the error var snailID = snail._id; console.log('saved snail ID ' + snailID); client.emit('setSnailID', snailID); var conditions = {_id: data.ownerID}, update = {$set: {newUser: false}} User.update(conditions,update,function(err){}); console.log('user updated'); }); }); 

客户

 saveSnail: function(snail) { // Core stats var data = {}; data.ownerID = ig.game.sessionUserID; data.inDb = true; data.name = snail.name; // etc.. console.log('saving snail'); this.socket.emit("savesnail", data); this.socket.once('setSnailID', function(snailid) { snail.snailID = snailid; console.log('snail ID set: ' + snailid); }); } 

在服务器控制台中,每个“已保存的蜗牛ID”看起来都是唯一且正确的。 但是,它发射到'setSnailID'后,我打印到客户端控制台相同的variables,ID原来是每个发射相同。

控制台输出示例

举个例子,让我们假装_id是个位数字。 现在我在客户端上调用saveSnail()四次,每次启动四个蜗牛。 在服务器控制台中,我会看到:

 saved snail ID 1 saved snail ID 2 saved snail ID 3 saved snail ID 4 

…但是当每个_id发送到客户端时,在客户端控制台中,我看到:

 snail ID set: 1 snail ID set: 1 snail ID set: 1 snail ID set: 1 

我应该注意到,如果我将客户端中的this.socket.on更改为this.socket.on ,则客户端控制台会获取每个ID的四个实例,然后开始打印:

 snail ID set: 1 snail ID set: 1 snail ID set: 1 snail ID set: 1 snail ID set: 2 snail ID set: 2 snail ID set: 2 snail ID set: 2 // etc 

…总共有16条线 – 每个ID有4条线

我最近才开始玩node.js,并认为我误解了一些非常基本的东西。 我怎么能传递正确的,唯一的_id MongoDb分配给每个新条目回到客户端?

Socket.io不只是发送string,它发送几乎所有的JavaScript值,包括的function。 您可以发送callback与您的数据。

客户:

 saveSnail: function(snail) { // Core stats var data = {}; data.ownerID = ig.game.sessionUserID; data.inDb = true; data.name = snail.name; // etc.. console.log('saving snail'); this.socket.emit("savesnail", data, function (err, snailid) { if (err) { return console.error(err); } snail.snailID = snailid; console.log('snail ID set: ' + snailid); }); } 

服务器:

 client.on('savesnail', function (data, cb) { console.log('save snail: ' + data.name); var snail = new Snail(data); snail.save(function (err, snail) { if (err) {return cb(err);} // Let the client handle the err var snailID = snail._id; console.log('saved snail ID ' + snailID); var conditions = {_id: data.ownerID}, update = {$set: {newUser: false}} User.update(conditions,update,function(err){}); console.log('user updated'); cb(null, snailID); }); });