首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过socket.io将服务器上的正确变量作为不正确的变量传递给客户端。

通过socket.io将服务器上的正确变量作为不正确的变量传递给客户端。
EN

Stack Overflow用户
提问于 2013-04-25 20:35:45
回答 1查看 106关注 0票数 1

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

服务器

代码语言:javascript
运行
复制
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');
    });

});

客户端

代码语言: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);
    this.socket.once('setSnailID', function(snailid) {
        snail.snailID = snailid;
        console.log('snail ID set: ' + snailid);
    }); 
}

在服务器控制台中,每个“保存的蜗牛ID”看起来都是唯一和正确的,就像它应该的那样。但是,在它发射到'setSnailID‘并将相同的变量打印到客户端控制台后,ID与每个发出的ID都是相同的。

控制台输出示例

举个例子,让我们假设_ids是个位数。现在,我在客户端上调用saveSnail()四次,每次调用初始化的四只蜗牛一次。在服务器控制台中,我会看到:

代码语言:javascript
运行
复制
saved snail ID 1
saved snail ID 2
saved snail ID 3
saved snail ID 4

当将每个...but发送到客户端时,我在客户机控制台中看到:

代码语言:javascript
运行
复制
snail ID set: 1
snail ID set: 1
snail ID set: 1
snail ID set: 1

应该注意的是,如果我将客户机中的this.socket.once更改为this.socket.on,客户端控制台将获取每个ID的四个实例,因此它将开始打印:

代码语言:javascript
运行
复制
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传递给客户端?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-25 23:05:39

Socket.io不仅发送字符串,还发送几乎所有javascript值,包括函数。您可以发送一个回调与您的数据。

客户:

代码语言: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);
    });
}

服务器:

代码语言:javascript
运行
复制
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);
    });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16224250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档