使用NodeJS和ExpressJS存储全局对象的最佳方法是什么

时间:2016-05-28 22:25:34

标签: node.js express

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

我想知道在Node和Express中最有效的方法是什么?

在做了一些研究之后,我发现了一些方法,尽管大多数方法似乎都是非常简单的,例如全局对象(global.myuser = {})。

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

最好的办法是什么?

2 个答案:

答案 0 :(得分:3)

让模块为您管理数据,然后在您要访问它的任何位置管理该模块中的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-session,因为它为您完成了90%的工作。您可以为每个登录用户获取一个对象,您可以存储所需的任何内容,并且该信息将仅与该用户直接关联。

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

答案 1 :(得分:2)

您无法使用global保存当前登录的用户。问题是所有用户都具有相同的global。因此访客用户可以访问admin个页面。

如果您需要在快速模块之间共享数据,可以在request变量中添加您想要的数据。

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
})