Global in NodeJS application

时间:2015-04-23 05:44:00

标签: node.js global

I am working on a NodeJS application, I have different modules and in those modules different packages as those packages are using functions from other packages, I had a problem requiring controllers everywhere so what i did is, I Globalized those controllers,

e.g.

global.CTRLS = { userCtrl : [require('./User/profile/controller/profileCtrl')]    
, productCtrl : [require('./Product/Products/controller/productCtrl')] }

so my question is

  1. Is there any performance issue while globalizing these controllers, will there be any performance effect on my application?
  2. If there is an issue using global what can be the other better way?

2 个答案:

答案 0 :(得分:2)

我使用了需求的混合(如在@Hinrich回答中)和global.someNamespaceName.anInstance

通常,我使用global.someNamespaceName.anInstance来引用对象,即类的特定实例,例如特定的数据库连接或应用程序的特定配置。例如,在主应用程序初始化代码中,类似

var config = { lots of config stuff, e.g.  .mongoURI, .port, .loggerFormat, .prefs, ... }
...
global.myAppName.config = config ;
global.myAppName.myMongo = new MyMongo(config.mongoURI);
global.myAppName.mySQL = new MySQL(config.mySQLSettings);

我主要针对“典型”节点事物和标准库使用需要,即var QueryString = require('querystring');

这似乎对我的想法“似乎是对的”,但不知道是否有任何具体的指导方针,两种方式都可以。 global.xxx的优点是你可以避免在每个文件的开头有几十个需求,并且排序可能是一个问题。

使用global.myAppName.someOtherName:

的两个可能的缺点
  1. 命名空间冲突。除非你有一个庞大的项目和多个不通信的程序员,否则不应该成为一个问题。而这也可能发生在需要......
  2. 需要两次查找(.myAppName和.someOtherName)来查找对象,这将是非常小的性能命中。如果您在循环中数千次引用该项,请将其缓存在本地变量中。

答案 1 :(得分:1)

您可以在需要它们的模块中require控制器。所以在模块中,例如

var profileCtrl = require('./User/profile/controller/profileCtrl');

或控制器所在的任何地方,相对于您的呼叫模块。然后,您可以访问控制器,并可以访问它的导出变量和函数。