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

Is it safe to use and update global variables in NodeJS?

本文关键字:全局变量 是否 安全 更新 NodeJS      更新时间:2023-09-26

我有一个节点服务器,用于加载任何人都可以编写的某些脚本。我知道当我启动我的 Node 服务器时,模块第一次在全局范围内加载。当一个人请求一个页面时,它会被"启动服务器"回调加载;我可以为每个请求使用所有已加载的模块。但是我还没有遇到过全局变量在请求期间更改并影响过程中所有其他实例的脚本(可能有)。

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

> Node.js是单线程的。因此,两个单独的请求不可能同时更改全局变量。所以从理论上讲,它是安全的。

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

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

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

不过,可以使用消息传递来实现假共享内存 - 有点像我们使用 ajax 或 socket.io 的方式。所以我个人会避免共享内存风格的多线程,除非我真的、真的需要在一个非常大的数据集上合作,这会让消息传递架构陷入困境。

再一次,请记住,Web是一个巨大的消息传递架构,消息是HTML和XML和json。因此,消息传递会缩放到Google的大小。