我试图通过socket.io将一个变量从服务器传递到客户端。我正在将数据保存到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‘并将相同的变量打印到客户端控制台后,ID与每个发出的ID都是相同的。
控制台输出示例
举个例子,让我们假设_ids是个位数。现在,我在客户端上调用saveSnail()四次,每次调用初始化的四只蜗牛一次。在服务器控制台中,我会看到:
saved snail ID 1
saved snail ID 2
saved snail ID 3
saved snail ID 4当将每个...but发送到客户端时,我在客户机控制台中看到:
snail ID set: 1
snail ID set: 1
snail ID set: 1
snail ID set: 1应该注意的是,如果我将客户机中的this.socket.once更改为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...resulting为16行,每个ID为4行
我最近才开始玩node.js,觉得我在这里误解了一些非常基本的东西。如何将MongoDb分配给每个新条目的正确、唯一的MongoDb传递给客户端?
发布于 2013-04-25 23:05:39
Socket.io不仅发送字符串,还发送几乎所有javascript值,包括函数。您可以发送一个回调与您的数据。
客户:
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);
});
});https://stackoverflow.com/questions/16224250
复制相似问题