【问题标题】:Correct variable on server gets passed as an incorrect variable to client via socket.io服务器上的正确变量通过 socket.io 作为不正确的变量传递给客户端
【发布时间】:2013-04-25 20:35:45
【问题描述】:

我正在尝试通过 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 结果与每次发送都相同。

控制台输出示例

作为一个例子,让我们假设 _ids 是个位数。现在我在客户端上调用 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.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

...总共产生 16 行 - 每个 ID 4 行

我最近才开始使用 node.js,并认为我在这里误解了一些非常基本的东西。如何将 MongoDb 分配给每个新条目的正确、唯一 _id 传递回客户端?

【问题讨论】:

  • 这看起来像是你的一个错误?毕竟,如果您使用“on”而不是“once”,那么所有 4 个 ID 确实都会到达客户端。似乎所有 4 个客户端套接字都以某种方式获取所有回调。粘贴处理连接的客户端代码和服务器代码?

标签: javascript node.js mongodb socket.io mongoose


【解决方案1】:

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);
    });
});

【讨论】:

  • 这非常有效,并教会了我如何在将某些内容同时存储在数据库中之后,正确地重新构建其他数据实例,这些实例被传递回客户端。谢谢!
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多