javascript - 服务器上的正确变量通过 socket.io 作为错误变量传递给客户端

标签 javascript node.js mongodb socket.io mongoose

我正在尝试通过 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() 四次,为启动的四个 snail 中的每一个调用一次。在服务器控制台中我会看到:

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 传递回客户端?

最佳答案

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

关于javascript - 服务器上的正确变量通过 socket.io 作为错误变量传递给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224250/

相关文章:

c# - 使用正则表达式过滤 MongoDB C# 驱动程序

javascript - 用户点击提交后提供反馈

node.js - Socket.IO重复消息

sql - MongoDB中地理空间索引的内部机制

javascript - `Node.js` 和/或其他 Javascript 分支相对于非 JS 框架(Rails、Django...)的性能、稳定性和速度

javascript - Node typescript 项目中的 Jest 覆盖总是返回空

java - 如何覆盖 SPRING BOOT 自动配置提供的默认值

javascript - 将交互式网格列上的值设置为另一列

javascript - 如何根据条件选择 React 组件 Prop

javascript - 在 ng-repeat 循环中仅显示某些 html 元素的最佳方法是什么