将我的io定义为global.io是否安全

时间:2017-12-08 09:06:21

标签: node.js sockets

我是nodejs和socket的新手。我想知道的是我应该如何在不同的控制器或文件中访问我的io变量。将io变量声明为:

是否安全
global.io = require('socket.io').listen(server);

所以现在我的io可以在我的任何控制器中访问吗?

我从这个链接得到了这个想法:
https://blog.sylo.space/use-global-variable-for-socket-io/

2 个答案:

答案 0 :(得分:0)

如果它与另一个变量重叠,它可能会导致崩溃,如果你的项目非常大和/或包含大量的librariers,它可能很难跟踪/处理,它也存在于应用程序的生命周期中,从而占用资源。并且使用全局变量总体上被认为是不好的做法。

您可以在此处查看有关node.js中全局变量的精彩文章 - http://stackabuse.com/using-global-variables-in-node-js/

编辑:既然你提到了安全性,理论上是安全的,不推荐。

答案 1 :(得分:0)

在大多数情况下,全局变量表明软件设计不佳。更好的方法是在不同的类/模块中包含所有IO代码。这是一段简短的代码片来说明我的意思:

const socketIO = require('socket.io');
class myIO {
    construct(server) {
        this.io = socketIO.listen(server)
    }

    doStuff() {
        // do stuff with your io socket
    }
}

module.exports = myIO;

现在你需要为你的控制器提供一个myIO实例,但我不确定在你的情况下是什么构成一个控制器。你是否需要每次都重新连接套接字,或者重用相同的套接字?

无论哪种方式,您可能想要查看依赖注入模式或使用单例:

module.exports = new myIO();

在这种情况下,require(“myio”)将始终返回相同的套接字。或者,如果您的框架有一个注册表,您可以使用它。