在 NodeJS 中使用和更新全局变量是否安全?
Is it safe to use and update global variables in NodeJS?
我有一个节点服务器,用于加载任何人都可以编写的某些脚本。我知道当我启动我的 Node 服务器时,模块第一次在全局范围内加载。当一个人请求一个页面时,它会被"启动服务器"回调加载;我可以为每个请求使用所有已加载的模块。但是我还没有遇到过全局变量在请求期间更改并影响过程中所有其他实例的脚本(可能有)。
我的问题是,就服务器崩溃而言,更改全局数据的安全性如何?另外,假设我已经编写了一个适当的锁定机制,该机制将在很短的时间内"暂停"所有实例的服务器,直到加载正确的数据。
> Node.js是单线程的。因此,两个单独的请求不可能同时更改全局变量。所以从理论上讲,它是安全的。
但是,如果您正在执行诸如将用户 A 的数据暂时保留在变量中之类的操作,然后在用户 A 稍后提交另一个请求时使用该变量,请注意用户 B 可能会在可能更改用户 A 的数据之间发出请求。
对于这种情况,将全局值保留在数组或对象中是分隔用户数据的一种方法。另一种策略是使用闭包,这是回调密集型或面向事件/承诺的库(如 socket.io)中的常见做法。
当涉及到多线程或多处理时,消息传递样式的 API(如 node 的内置集群模块)具有相同的保证,不会破坏全局,因为每个进程都有自己的全局。有几个多线程模块的实现方式类似 - 每个线程一个节点实例。但是,共享内存样式 API 无法做出这样的保证,因为每个线程现在都是一个真正的操作系统线程,它可能会相互抢占并破坏彼此的内存。因此,如果您决定尝试其中一个多线程模块,请注意此问题。
不过,可以使用消息传递来实现假共享内存 - 有点像我们使用 ajax 或 socket.io 的方式。所以我个人会避免共享内存风格的多线程,除非我真的、真的需要在一个非常大的数据集上合作,这会让消息传递架构陷入困境。
再一次,请记住,Web是一个巨大的消息传递架构,消息是HTML和XML和json。因此,消息传递会缩放到Google的大小。
- 在 Javascript 中创建全局变量时是否需要指定对象类型
- JSHint是否可以输出有关全局变量的警告
- 检查全局变量是否存在的正确方法是什么
- 确定是否在不使用任何全局变量的情况下加载了窗口
- js事件循环是否意味着可以为临时暂存空间使用全局变量
- 是否可以肯定刷新 $_SESSION[] 全局变量
- 如何在不设置全局变量的情况下确定是否已调用函数
- 对函数内部的全局变量所做的更改是否全局反映?Javascript
- 对角度模块使用单个全局变量是否是一种反模式
- 在 NodeJS 中使用和更新全局变量是否安全?
- 函数是否像局部变量一样适用于全局变量
- Javascript - 全局变量和全局范围内的变量是否不同(在 jsfiddle 中)
- 全局变量存储在 Node.JS 中的什么位置?节点中是否有类似窗口的对象
- 我是否正在创建一个全局变量
- 在Couchbase JavaScript视图中是否有可能的全局变量
- 是否可以将 Ext.Component 声明为全局变量
- 是否有任何选项可以在煎茶触摸中声明全局变量
- 自定义 jquery 函数中的参数是否可以更改全局变量的值
- 对于Javascript游戏引擎,重用全局变量是否比使用局部变量更有效?
- 在 .js 文件中声明全局变量是否不好