繁体   English   中英

Node.js全局变量和模块

[英]Nodejs global variables and modules

在nodejs中使用全局变量和assignig模块到全局变量是否存在任何安全问题?

例:

client = new Client();

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

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

尽量不要污染全局名称空间,如果确实需要全局变量,则仅将其与子对象一起使用。

我认为本质上并没有安全问题,但是您将污染全局名称空间。 随着项目的增长(尤其是拥有多个程序员),冲突的风险会越来越大。 而且,如果您以后在项目中添加一个具有名为“ client”的变量的第三方库,该怎么办?

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

Node不允许您按照要求的方式使用全局变量,因为模块中定义为全局的变量仅对该模块而言是全局的。 但是存在一个禁止用于您需要的GLOBAL对象。

全局变量通常(总是)是个坏主意,但是在其自己的名称空间中拥有有用函数的全局缓存完全不是犯罪,因为它不会覆盖任何内容,而是让您在代码中使用它。 因此,我将告诉您如何在模块之间共享功能和对象并使源代码井井有条(至少对我来说很重要!):

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

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

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;
...

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

5th在需要代码的地方,需要R.js文件并使用R对象访问它的成员

R.<property_or_function>

2警告提示。

  • 请记住,始终将共享函数或用户共享对象称为“ R”。 在它前面
  • 尽管您可以在任何地方为R对象分配新的函数,对象和属性,但这可能导致与全局变量相同的不一致,如果您不事先计划它的话–即在将共享函数分配给R之前先调用共享函数-因此作为一种方法,请在R.js文件中创建所有内容,而不是全部围绕您的代码进行。 这样,所有共享的内容都将保存在R.js中,这是查找共享代码的唯一位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM