【问题标题】:Using local and global variables properly in node.js在 node.js 中正确使用局部和全局变量
【发布时间】:2014-02-01 12:12:10
【问题描述】:

我越来越接近于理解全局和本地对象在 node.js 中的工作原理,但是当涉及到更复杂的东西(如服务器)时,我却被绊倒了。

在我对 node.js 的理解中,一个服务器可以被许多人访问,但应该只被实例化一次,所以这让我很困惑,我不知道其他服务器的行为如何(我使用的是 web sockets 服务器@ 987654321@)

我也明白了:

var _global='global';
function testing(){
    var _local='local';
    console.log(_global+' & '+_local);// 'global & local'
    return;}
testing();
console.log(_global+' & '+_local);// 'global & undefined'

现在在 node.js 中,如果我在服务器中声明 _local var 是否意味着它是每个人的唯一变量?

如果我创建一个全局服务器:

var wss=new WebSocketServer({host:port});
wss.on('connection',function(soc){
    soc['uid']=Math.floor(Math.random()*101);
    console.dir(soc);
    });

导航到连接到服务器的页面,我看到(在我的 putty ssh 客户端上)带有附加 id 的 websocket 对象。

然后,如果第二个用户访问该页面,我会看到(在 ssh 中)websocket 对象现在看起来像一个新对象,没有旧 id 只是一个新对象,我看不到两个连接...

所以我在想

我应该把这个socketserver放在一个http.server中,然后用ajax调用服务器吗?

客户:

var xhr=XHRobject();
xhr.open("POST","mysite.com:8005",true);
xhr.setRequestHeader("Content-Type","text/csv");
xhr.send('create server');

服务器:

var http = require('http');
http.createServer(function(req,res){
    req.on('data',function(chunk){
        chunk=chunk.toString('utf8');
        if(chunk==='create server'){
            wss=new WebSocketServer({host:port});//etc..
            }
        });
    });

虽然我认为 WebSocketServer 有一个列表 wss.clients 需要访问的已连接 websockets 列表,但这会产生问题,所以我认为我不应该拥有多个服务器...?

如果我声明一个变量 (var localisedsocket) 并将 wss.on('connection',function(soc){soc=localisedsocket;});在 http 服务器内部,那么每个打开 WebSocketServer 的用户都不会再写入套接字对象了吗?

我的理论正确吗?

【问题讨论】:

    标签: node.js websocket


    【解决方案1】:

    我的理论正确吗?

    没有。您的“_global”变量只是上层范围内的局部变量。

    无论如何,经验法则是:除非您有充分的理由不这样做,否则请始终使用局部变量,并将“var”放在可能的最后时刻(意味着,在可能的最低范围内)。

    【讨论】:

    • 为什么要把 var 放在尽可能低的位置?
    • 为了限制变量的作用域,避免无意识的变量共享和内存泄漏。
    【解决方案2】:

    不需要 http 服务器或 ajax。所有需要做的事情是这样的:

    var wss=new WebSocketServer({host:port});//-----global for everyone
    wss.on('connection',function(soc){
        var s={};//------------------------------s is local and unique to the user!
        s[1]=soc;
        s[1]=Math.floor(Math.random()*101);
        console.dir(s[1]);
        console.dir(wss);//-------now everyone can see all connected clients
        });
    

    关键是服务器必须是全局的,但套接字必须是本地的。每个人都在使用同一个服务器,但是当用户连接时,他们会得到自己的 WebSocket!

    我想我终于不只是看到了本地和全局之间的区别,而且我终于看到了这个功能在 javascript 中的用处!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2017-06-02
      • 2011-07-23
      相关资源
      最近更新 更多