- 我有我执行的
/bin/www
,websocketServer.js
需要/bin/www
中的httpServer
对象来初始化websocket服务器。如何在不使用全局变量的情况下将httpServer
传递给websocketServer.js
?
websocket服务器.js:
let WebSocket = require('ws')
let wss = new WebSocket.Server({ server: global.httpServer })
wss.on('connection', (connection, req) =>
...
/bin/www:
let app = require('../app')
let http = require('http')
...
global.httpServer = http.createServer(app)
httpServer.listen(port)
...
- 我有
foo.js
和bar.js
,它们都处理仅在运行时持久存在的用户信息(无需存储在数据库中)。这两个文件如何与相同的用户一起工作?我只能考虑使用共享变量(又名全局变量)。在这种情况下,有什么方法可以避免使用全局变量吗?如果在我的脑海中使用全局变量是完全有意义的,我是否应该费心避免使用全局变量?
此外,我遇到了需要运行时全局变量的情况,因为到目前为止我一直在使用本质上是全局变量提供者的数据库。除了现在我的项目需要全局变量,但不必存储在数据库中。
foo.js:
...
function getsCalledWhenUserLogsIn(username)
{
global.users[username] = { timer: new Timer(), websocketConnection: null, ... }
// initializing the user below
...
}
...
酒吧.js:
...
websocketServer.on('connection', (connection, req) =>
{
...
connection.on('message', (message) =>
{
let user = global.users[JSON.parse(message).username]
if (user)
{
user.websocketConnection = connection
...
}
...
}
...
}
...
这不是我的代码本身,但至少它给了你一些想法
我希望能够以不必使用全局变量的方式构建文件。
全局变量的示例:
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);
这过于简单化,但重点是:如果您希望两个不同的事物可以访问同一对象而不相互了解,则需要"第三件事"将这个对象传递给前两个事物。
另请参阅:依赖注入。
至于你是否应该一直这样做的问题...我认为避免全局变量是你应该一直努力的事情,除非你有充分的理由不这样做。最佳做法是一个很好的默认值,但如果常识表明您不应该将其应用于特定情况,请打破它们。
但是,我认为您在这里没有足够有效的案例。你只需要更好地学习函数和参数。
为了避免全局变量,你可以使用 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();
您还可以拥有具有对象的全局数组,然后只是遍历它们。然后你有一个数组。这只取决于你想怎么做。