编程语言
首页 > 编程语言> > Javascript-在NodeJS中使用和更新全局变量是否安全?

Javascript-在NodeJS中使用和更新全局变量是否安全?

作者:互联网

我有一个节点服务器,用于加载可由任何人编写的某些脚本.我知道启动节点服务器时,模块会在全局范围内首次加载.当请求页面时,页面将由“启动服务器”回调加载;而且我可以根据请求使用所有已经加载的模块.但是我还没有遇到一个脚本,在该脚本中,全局变量在请求期间会发生变化,并且会影响流程中的每个其他实例(也许有).

我的问题是,就服务器崩溃而言,更改全局数据有多安全?另外,假设我已经编写了一种适当的锁定机制,该机制将在很短的时间内“暂停”所有实例的服务器,直到加载正确的数据为止.

解决方法:

Node.js是单线程的.因此,两个单独的请求无法同时更改全局变量.因此,从理论上讲,这是安全的.

但是,如果您正在做类似将用户A的数据暂时保留在变量中的操作,然后当用户A稍后提交另一个请求时,请使用该变量,请注意,用户B可能会在可能更改用户A的数据之间发出请求.

对于这种情况,将全局值保留在数组或对象中是分离用户数据的一种方法.另一种策略是使用闭包,这在回调密集型或面向事件/承诺的库(例如socket.io)中很常见.

当涉及多线程或多处理时,消息传递样式的API(例如节点的内置群集模块)具有不破坏全局变量的相同保证,因为每个进程都有自己的全局变量.有几个实现类似的多线程模块-每个线程一个节点实例.但是,共享内存样式的API不能做出这样的保证,因为每个线程现在都是真正的OS线程,它们可以相互抢占并破坏彼此的内存.因此,如果您决定尝试使用多线程模块之一,请注意此问题.

但是,可以使用消息传递来实现伪共享内存-类似于我们使用ajax或socket.io的方式.因此,我个人会避免使用共享内存样式多线程,除非我真的非常需要在一个非常庞大的数据集上进行合作,而这将使消息传递体系结构陷入困境.

再一次,请记住,Web是一个巨大的消息传递体系结构,消息为HTML,XML和json.因此,邮件传递的规模取决于Google的大小.

标签:javascript,node-js,global-variables
来源: https://codeday.me/bug/20191009/1879642.html