【问题标题】:Unclear about node.js; one variable for everyone?不清楚 node.js;每个人都有一个变量?
【发布时间】:2014-02-18 18:11:19
【问题描述】:

我正在为 node.js 使用这个简单的 WebSockets 实现 https://npmjs.org/package/ws

想知道服务器上的变量是否默认是用户或服务器特定的......?我无法理解许多用户和一台服务器......节点现在看起来就像薛定谔的猫(它既是又不是)

如果我设置服务器:

var thing=(thing>0)?thing:0; 
console.log('thing='+thing+' this only seems to happen when the server born, hmm ok...');

//Normal require/set up ws stuff...
wss.on('connection',function(ws){
    thing=Math.floor(Math.random()*101);
    ws.on('message',function(_){
        ws.send('reply: thing='+thing);
        });
    });

还有客户:

ws=new WebSocket('ws://'+somehost+':'+(someport));
ws.onopen=function(){
    ws.onmessage=function(_){console.log(_.data);}
    ws.send('question: what is the thing now?');
    }

$('#button').click(function(){ws.send('question: what is the thing now?');});

现在如果我有两个用户(A 和 B)一个接一个地访问网站:

  • 用户 A 将打开页面并将 var 视为第一个随机数

  • 用户 B 将其视为第二个随机数

  • A 可以点击按钮,然后将其视为第二个随机数

  • 如果 B 点击按钮 B 也会看到第二个随机数

...因为B在服务器上给大家改了?

我这样做对吗?要在服务器上创建一个特定于连接的变量没有来自客户端的(零)有用信息?

如果我不清楚我想做的是 A 总是看到它设置的数字,而 B 总是看到它设置的数字。

服务器可以/是否知道区别?

只是将代码放在哪里的问题吗? (如示例仅在服务器诞生时显示控制台日志)

或者它是否类似于 Javascript 复制对象与引用对象之间的区别?

【问题讨论】:

    标签: node.js var


    【解决方案1】:

    这取决于您放置var 关键字的位置。您现在拥有它的范围是在新连接上执行的函数之外,因此您在每个连接之间共享一个 thing

    如果您将 var 关键字移动到您的函数中,如下所示:

    var thing = Math.floor(Math.random()*101);
    

    然后thing 将在该函数的上下文中是本地的,这意味着将有两个单独的things(每个连接一个),因为该函数针对每个新连接执行一次。

    【讨论】:

    • 哇,你只用这么少的字眼就让我明白了!现在有两个相同的东西! :D
    【解决方案2】:

    每次有人连接时,全局 thing 变量都会重新随机化。该变量只有一个实例。

    如果您想要每个用户的变量,请使用对象字典。

    var things = {}
    

    然后在连接上你就可以做

    things[unique_user_id] = // whatever
    

    我认为在该连接对象ws 的某处,应该有一个可以使用的唯一标识符。

    【讨论】:

    • 但是服务器怎么知道你下次点击对象的哪一部分呢?如果服务器生成了号码,为什么客户端需要告诉服务器号码是什么?
    • @BENZ.404:嗯?只要连接保持打开状态,ID 就不会改变。客户不需要知道它是什么。该 ID 可用于整个 wss.on('connection',function(ws){ 范围。您也可以在 .on('message' 位中使用它。
    • 我没有专门使用 ws 库,所以我不能 100% 确定它是否会向您提供此 ID,但如果没有,您可以在连接时函数中生成 GUID (记住使用var 关键字inside),你会没事的。或者甚至只是将你需要的所有东西都存储在那里(就像 Paulpro 建议的那样),你甚至不需要担心它。这仅取决于您需要从哪里访问 var;如果您需要从其他范围访问用户数据,或者了解有多少用户已连接(请记住在断开连接时删除),有时拥有一个全局对象很有用。
    • 我现在完全明白了
    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2017-02-08
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多