存储在Node.JS Express全局命名空间中的变量是否对当前请求是私有的?

问题描述 投票:0回答:2

Node.JS Express应用程序有一个全局对象,充当“包”,您可以将数据/对象附加到应用程序中的所有代码可用的数据/对象:

// Create an appRoot global variable that tells the code base what the root directory of this app is.
global.appRoot = path.resolve(__dirname);

我主要担心的是,我需要确保全局对象只是全局的,因为在当前客户端请求的上下文中操作的所有代码都有另一个访问该对象中的数据,并且数据不是请求之间或之间可用。否则,我可能会泄漏必须对特定请求或用户保密的数据。

为了确保我清楚,我们举个例子:

  • GET请求#1:名称“john doe”存储在global.userName中
  • GET请求#2:在请求开始时,global.UserName未分配,绝对不包含“john doe”

换句话说,是否每个请求都重新初始化全局对象,或者只要服务器正常运行,它就会持续存在,对于到达服务器的所有请求都可用,并且没有任何“技巧”可能导致不必要的数据泄漏服务器请求?

node.js express security global
2个回答
1
投票

node.js global对象对整个node.js进程是全局的。它与Express没有任何关系。但是,Express确实有一些具有不同范围的对象,您可以使用这些对象在客户端请求中保留数据,或跨所有客户端请求保留事件。来自Express文档:

res.locals

包含作用于请求的响应局部变量的对象,因此仅对在请求/响应周期(如果有)期间呈现的视图可用。

app.use(function(req, res, next){
  res.locals.user = req.user;
  res.locals.authenticated = ! req.user.anonymous;
  next();
});

app.locals

app.locals对象的属性是应用程序中的局部变量...一旦设置,app.locals属性的值在应用程序的整个生命周期中都会持续存在,而res.locals属性仅在生命周期内有效。请求。

Express app.locals对象类似于node.js全局对象,只要它在多个请求中保存在内存中即可。但是,它是Express实例的本地,如果该实例被删除,app.locals对象也将被删除。 node.js global对象的不同之处在于它将在整个node.js进程的生命周期中保持不变。


1
投票

是的,全局变量将持续用于任何请求。除非您旋转节点应用程序的另一个实例。如果你正在寻找一些认证/会话工具,那里有很多,比如passportcookie-parser

© www.soinside.com 2019 - 2024. All rights reserved.