Nodejs全局变量和模块

时间:2011-12-08 09:41:11

标签: javascript node.js

是否有任何安全问题或使用全局变量和将模块分配给nodejs中的全局变量?

示例:

client = new Client();

没有var语句,我可以在任何地方使用它吗?

3 个答案:

答案 0 :(得分:6)

这不是一个安全问题,但它被认为是不好的做法,它可能导致其他问题,例如尝试覆盖Node.js全局变量。

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

答案 1 :(得分:2)

我认为本身并不存在安全问题,但您将污染全局命名空间。随着项目的增长(特别是对于一个以上的程序员),冲突的风险会越来越大。如果您稍后在项目中添加一个名为“client”的变量的第三方库,该怎么办?

答案 2 :(得分:1)

我已经使用Node几年了,我遇到了同样的“问题”并且令人沮丧。不过,我可以给你解决方案,它对我有用。

节点不允许您提出全局变量,因为模块中定义为全局的变量仅对该模块是全局。但是存在一个禁止用于你需要的GLOBAL对象。

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

1st 创建一个资源文件,您可以在其中放置要在代码中共享的所有重要功能和对象。我称之为“R.js”,R来自Resources

2st 定义将存储所有函数和对象的“R”对象,并将其分配给节点的GLOBAL对象:

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

3rd 为了简单起见,避免额外需要所有代码,我需要在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;
...

4th 在R对象中创建您喜欢的共享函数,变量和对象

5th 如果您需要代码,需要R.js文件并使用R对象访问其成员

R.<property_or_function>

2个警告说明。

  • 请记住始终调用共享函数或用户共享对象placind“R”。在它面前
  • 虽然您可以将新功能,对象和属性分配给R对象,但如果您没有提前计划,则会导致与全局变量相同的不一致 - 即在将其分配给共享函数之前调用共享函数R - 作为一种方法,在R.js文件中创建所有内容,而不是在代码中完成所有操作。这样,所有共享内容都将出现在R.js中,这是查找共享代码的唯一地方。