首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在Nodejs中使用全局变量?

问如何避免在Nodejs中使用全局变量?
EN

Stack Overflow用户
提问于 2017-10-01 19:23:17
回答 2查看 1.4K关注 0票数 0
  1. 我执行的是/bin/www,websocketServer.js需要从/bin/www中的httpServer对象来初始化websocket服务器。如何不使用全局变量将httpServer传递给websocketServer.js?

websocketServer.js:

代码语言:javascript
复制
let WebSocket = require('ws')
let wss = new WebSocket.Server({ server: global.httpServer })
wss.on('connection', (connection, req) =>
...

/bin/www:

代码语言:javascript
复制
let app = require('../app')
let http = require('http')
...
global.httpServer = http.createServer(app)
httpServer.listen(port)
...
  1. 我有foo.js和bar.js,它们都处理仅在运行时持久的用户信息(不需要存储在数据库中)。这两个文件如何与相同的用户一起工作?我只能考虑使用共享变量,也就是全局变量。在这种情况下,有没有办法避免使用全局变量?如果在我的脑海中使用全局变量是完全有意义的,那么我甚至应该避免使用这些变量吗? 此外,我遇到了需要运行时全局变量的情况,因为到目前为止,我一直在使用一个数据库,它本质上是全局变量的提供者。除了现在,我的项目需要的变量必须是全局的,但不需要存储在数据库中。

foo.js:

代码语言:javascript
复制
...
function getsCalledWhenUserLogsIn(username)
{
    global.users[username] = { timer: new Timer(), websocketConnection: null, ... }
    // initializing the user below
    ...
}
...

bar.js:

代码语言:javascript
复制
...
websocketServer.on('connection', (connection, req) =>
{
    ...
    connection.on('message', (message) =>
    {
        let user = global.users[JSON.parse(message).username]
        if (user)
        {
            user.websocketConnection = connection
            ... 
        }
        ...
    }
    ...
}
...

这不是我的代码本身,但至少它给了你一些想法。

我希望能够以一种不用使用全局变量的方式来构造我的文件。

EN

回答 2

Stack Overflow用户

发布于 2017-10-01 19:29:40

使用全局变量的示例:

代码语言:javascript
复制
global.bar = 'hello world';

function foo1() {
   console.log(bar);
}

function foo2() {
   console.log(bar);
}

foo1();
foo2();

没有全局变量的示例:

代码语言:javascript
复制
var bar = 'hello world';

function foo1(bar) {
   console.log(bar);
}

function foo2(bar) {
   console.log(bar);
}

foo1(bar);
foo2(bar);

这过于简单化,但要点是:如果您希望有两个不同的对象可以访问相同的对象而不知道对方,则需要“第三个东西”才能将该对象传递给前两个对象。

参见:依赖注入。

至于你是否应该一直这样做的问题.我认为,除非你有一个很好的理由不去做,否则你应该一直为避免全球化而努力。最佳实践是一个很好的默认,但如果常识要求您不应将其应用于特定情况,则可以打破它们。

但是,我认为你在这里没有足够的证据。你只需要更好地学习函数和参数。

票数 1
EN

Stack Overflow用户

发布于 2017-10-01 19:31:37

为了避免全局变量,您可以使用XMLHttpRequest,只需自己获取/发布即可。这不是最有效率的事情,但它仍然有效。

代码语言:javascript
复制
var xhr2 = new XMLHttpRequest();
xhr2.open('GET', "http://yourserver", true);
xhr2.onreadystatechange = function() {
    if (this.status == 200 && this.readyState == 4) {
        if(this.responseText == '') { return;}
      //your code here
  }//
  };//end onreadystate
 xhr2.send();

您还可以拥有具有对象的全局数组,并且只需要遍历它们。那么你就有了一个数组。这取决于你想怎么做。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46516035

复制
相关文章

相似问题

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