/bin/www
而websocketServer.js
需要来自httpServer
的{{1}}对象来初始化websocket服务器。如何在不使用全局变量的情况下将/bin/www
传递给httpServer
?websocketServer.js:
websocketServer.js
/ bin中/ WWW:
let WebSocket = require('ws')
let wss = new WebSocket.Server({ server: global.httpServer })
wss.on('connection', (connection, req) =>
...
let app = require('../app')
let http = require('http')
...
global.httpServer = http.createServer(app)
httpServer.listen(port)
...
和foo.js
,它们都处理仅在运行时持久的用户信息(无需存储在数据库中)。这两个文件如何与同一用户一起使用?我只能想到使用共享变量aka global。有没有办法避免在这种情况下使用全局变量?我是否应该费心避免使用全局变量?如果在我的脑海中使用它们是完全合理的呢?
此外,我遇到了需要运行时全局变量的情况,因为到目前为止我一直在使用一个本质上是全局变量提供者的数据库。除了现在我的项目需要变量需要全局但不必存储在数据库中。foo.js:
bar.js
bar.js:
...
function getsCalledWhenUserLogsIn(username)
{
global.users[username] = { timer: new Timer(), websocketConnection: null, ... }
// initializing the user below
...
}
...
这不是我的代码本身,但至少它给你一些想法
我希望能够以一种我不必使用全局变量的方式构建我的文件。
答案 0 :(得分:0)
全局变量示例:
global.bar = 'hello world';
function foo1() {
console.log(bar);
}
function foo2() {
console.log(bar);
}
foo1();
foo2();
没有全局变量的示例:
var bar = 'hello world';
function foo1(bar) {
console.log(bar);
}
function foo2(bar) {
console.log(bar);
}
foo1(bar);
foo2(bar);
这是过于简单化了,但重点是:如果你想要两个不同的东西可以访问同一个对象而不知道对方,你需要一个“第三件事”来将这个对象传递给前两个东西
另见:依赖注入。
关于你是否应该总是这样做的问题...我认为避免全局变量是你应该始终努力的事情,除非你有充分的理由不这样做。最佳实践是一个很好的默认操作,但如果常识要求您不应将其应用于特定情况,请将其打破。
但是,我认为你没有足够的有效案例。你只需要更好地学习函数和参数。
答案 1 :(得分:0)
为了避免全局变量,您可以使用XMLHttpRequest并只为自己使用GET / POST。不是最有效的东西,但它仍然有效。
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();
您还可以拥有包含对象的全局数组,并且只需通过它们。然后你有一个数组。这取决于你想要的方式。