2011-12-08 41 views
1

是否有任何安全问题或使用全局变量和assignig模块到nodejs中的全局变量?Nodejs全局变量和模块

例如:

client = new Client(); 

没有var声明,这样我就可以在任何地方使用它?

回答

6

这并不是说它是一个安全问题,它被认为是不好的做法,但它可能会导致其他问题,如试图重写Node.js全局变量。

尽量不要污染全局名称空间,如果你确实需要全局变量,只需使用一个子对象。

+0

好吧,像'global.client'一样吗? – georgesamper

+0

更像global.PROJECT_NAME = {},因为你想避免一个普通的名字。最好以大写字母开头或只使用大写字母。 – alessioalex

+0

哦,好的,谢谢:) – georgesamper

2

我不认为有安全问题本身,但你会污染全球命名空间。随着项目的增长(尤其是多个程序员),冲突的风险会变得更大。那么如果你以后为你的项目增加了一个名为'client'的变量的第三方库?

1

我一直在使用节点几年,我有同样的“问题”,你有和令人沮丧。不过,我可以给你我解决的解决方案,它适用于我。

节点不允许以您要求的方式显示全局变量,因为模块中定义为全局的变量仅适用于该模块的全局。但是存在一个GLOBAL对象,禁止用于你需要的内容。

全局变量通常是一个坏主意(总是),但是在它自己的命名空间中有一个有用函数的全局缓存并不是一种犯罪行为,因为它不会覆盖任何东西并让您沿着代码使用它。所以我要告诉你我做什么,在模块之间共享功能和对象,并保持组织源(这对我来说很重要,至少!):

创建一个资源文件,你把所有重要的功能及对象,想要分享您的代码。我定义为“R.js”,R从资源

2ST定义“R”的对象将存储的所有功能和对象,并将其分配到节点的全局对象:

var R = {}; 
GLOBAL.R = R; // Adds resource module to global 

为了简单起见,避免额外的需要所有的代码,我所有需要的内部R.js。之后,你只需要与R.require_variable.function_or_property

// All needed requires 
R.fs  = require('fs'); 
R.net  = require('net'); 
R.http  = require('http'); 
R.dbClient = require('mysql').Client; 
... 

创建共享函数,变量使用它们,你的对象将R对象

在需要的地方以防万一你的代码里面喜欢,需要R.js文件并使用R对象访问其成员

R.<property_or_function> 

2警告提示。

  • 请记住总是调用共享函数或用户共享对象placind“R.”在它之前
  • 虽然你可以在任何地方给R对象分配新的函数,对象和属性,但如果你事先没有计划,这会导致与全局变量相同的不一致 - 即你调用一个共享函数在将其分配给R之前 - 作为一种方法,在R.js文件中创建所有内容,而不是在代码中完成所有操作。这样,所有共享的东西都将在R.js中,并且这是唯一寻找共享代码的地方。