ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-09 13:38:47  阅读:265  来源: 互联网

标签:javascript node-js global-variables


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

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

解决方法:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有