Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用NodeJS和ExpressJS存储全局对象的最佳方式是什么_Node.js_Express - Fatal编程技术网

Node.js 使用NodeJS和ExpressJS存储全局对象的最佳方式是什么

Node.js 使用NodeJS和ExpressJS存储全局对象的最佳方式是什么,node.js,express,Node.js,Express,我试图存储数据(很可能是一个对象),以便整个应用程序都可以访问它。例如,有关我当前登录用户的信息(用户ID和名称) 我想知道在Node和Express中执行此操作最有效的方法是什么 在做了一些研究之后,我找到了一些方法,尽管大多数方法看起来都很不正统,比如全局对象(global.myuser={}) 我还发现我可以将一个对象存储为一个模块,并将其包含在我需要的地方,尽管我不太确定使用这种方法是否可以保存数据 最好的方法是什么?让一个模块为您管理数据,然后在该模块中的任何您想要访问的地方requi

我试图存储数据(很可能是一个对象),以便整个应用程序都可以访问它。例如,有关我当前登录用户的信息(用户ID和名称)

我想知道在Node和Express中执行此操作最有效的方法是什么

在做了一些研究之后,我找到了一些方法,尽管大多数方法看起来都很不正统,比如全局对象(
global.myuser={}

我还发现我可以将一个对象存储为一个模块,并将其包含在我需要的地方,尽管我不太确定使用这种方法是否可以保存数据


最好的方法是什么?

让一个模块为您管理数据,然后在该模块中的任何您想要访问的地方
require()
require()
会被缓存,因此对它的后续调用每次都会让您返回相同的模块,该模块对共享数据非常有效,而无需实际使用全局可访问变量,同时保持适当的依赖关系管理(全局变量在node.js中通常是有害的,因为它们根本不显示依赖关系)

请注意,node.js中的全局可访问数据由所有用户的请求共享,除非您专门使其仅对某些用户可用。所以像
global.myuser
这样的变量听起来很危险,除非
myuser
是服务器用户(其中只有一个),而不是请求的实际用户

下面是一个简单的例子:

// shared_data.js
var myData = {someKey: 12345678};

module.exports = myData;
然后,在其他模块中:

 var sharedData = require('./shared_data.js');

 // you can access the sharedData object here

如果您试图记住登录的用户,那么您需要一个更复杂的系统,该系统涉及通过登录cookie令牌跟踪给定用户,并在服务器上存储有效的登录令牌,各种请求可以检查该用户是否实际登录

对于使用Express登录的用户,我建议使用
Express会话
,因为它可以为您完成90%的工作。您可以为每个登录的用户获取一个对象,您可以在其中存储任何您想要的内容,并且该信息将仅与该用户直接相关


当前用户的会话对象将在任何传入请求的
请求
对象中自动可用。并且,您可以将该会话对象传递给您希望从请求中调用的任何其他函数。

您不能使用
全局
保存当前登录的用户。问题是,所有用户都将具有相同的
全局
。因此,来宾用户将有权访问
admin
页面

如果需要在express模块之间共享数据,可以向
请求
变量添加所需的内容

app.get('*',function(req,res){
    req.firstRoute=true
    req.currentUser=30
})
app.get('/othertoure',function(req,res){
    console.log(req.firstRoute) // = true
    console.log(req.currentUser) // = 30
})

是,他们将是登录用户。我要求服务器知道它向哪个用户提供数据,这样我就可以通过MongoDB调用包含他们的ID,以获取只与他们相关的数据。实际上,我甚至没有想到,无论我如何存储全局数据,对所有用户来说都是完全相同的。如果我使用类似于
express sessions
包的方法会怎么样?请参阅我关于每个用户保存数据的回答:我建议使用express session。看看我在回答中添加了什么。@Aminadav-你为什么要对我发表评论。如果你想对OP发表评论,那么可以将评论放在原始帖子中,或者使用@语法对OP的答案进行评论。我是在对@Fizzix发表评论。他在我上面的评论中问了一些问题,我回答了他。OP似乎希望为登录用户跨请求存储每个用户的数据。我不明白这是如何实现的。他没有说他希望它能够跨请求工作。他说了整个应用程序。每个请求,他都应该进行验证,并将用户数据添加到
req
对象中。之后,他可以通过应用程序(其他路径)访问数据,直到请求结束