gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:54:52 32 4
gpt4 key购买 nike

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

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

最佳答案

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

但是,如果您正在做一些事情,例如将用户 A 的数据暂时保存在一个变量中,然后当用户 A 稍后提交另一个请求时使用该变量,请注意用户 B 可能会在可能更改用户 A 的数据之间发出请求。

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

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

可以使用消息传递来实现假共享内存 - 有点像我们使用 ajax 或 socket.io 的方式。因此,我个人会避免共享内存式多线程,除非我真的、真的需要合作处理一个非常大的数据集,这会拖累消息传递架构。

再一次记住,网络是一个巨大的消息传递架构,消息是 HTML、XML 和 json。因此,消息传递可按比例缩放到 Google 大小。

关于javascript - 在 NodeJS 中使用和更新全局变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572166/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com