node.js - 在不使用全局变量的情况下在 node.js 中跨文件共享变量

标签 node.js express socket.io

我试图将我的 socket.io 代码从我的主文件 (app.js) 分离到一个单独的文件 (socket.js) 中。但是,我需要在 app.js 中定义我的 io 对象,它也在我的 socket.js 文件中使用。

目前,我将 io 设置为全局变量,因此可以从 app.js ( Global Variable in app.js accessible in routes? ) 访问它,但我知道这是不好的做法。有没有更好的方法来做到这一点(在这种情况下可以注入(inject)工作,因为我需要将变量从 app.js 导出到 socket.js 而不是相反)?谢谢!

应用程序.js

var app = express(),
  server = require('http').createServer(app);

//KIV -> io is set as a global variable
io = require('socket.io').listen(server);
require('./socket');

套接字

io.sockets.on('connection', function(socket) {
    //xxx
}

最佳答案

其中一种方法是将对象作为参数传递给函数(正如@Thomas 的回答中所述)。

另一种方法是创建一个新文件,比如“global.js”。仅将那些您希望成为全局的项目放入此文件中。例如

var Global = {
    io : { }
};    
module.exports = Global;

现在,在你的 app.js 中,

var app = express(),
    server = require('http').createServer(app), 
    global = require('./global.js');

global.io = require('socket.io').listen(server);
require('./socket');

在你的 socket.js 中:

var global = require('./global.js');
global.io.sockets.on('connection', function(socket) {
    //xxx
}

希望对你有帮助

关于node.js - 在不使用全局变量的情况下在 node.js 中跨文件共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15736806/

相关文章:

express - 如何将Google Cloud Storage与react.js结合使用?

node.js - 快速重定向错误的网址

javascript - Angular/ express : Redirecting to the last page visited after logging in

node.js - 使用 Socket.IO,如何找出断开连接的用户的 session ID?

node.js - 如何使Electron和Socket.io应用程序在瘦客户端体系结构中运行?

node.js - 将异步等待查询包装在 try catch 中

node.js - Apache Cordova 安装错误

Node.js 的可写流和 drain 事件

node.js - 在 Nodejs 中 normalizePort() 函数有什么作用?

node.js - 如何使用 SessionID 从 RedisStore (connect-redis) 获取 session 数据?