【问题标题】:What is the best way to store global objects with NodeJS and ExpressJS用 NodeJS 和 ExpressJS 存储全局对象的最佳方法是什么
【发布时间】:2016-05-29 06:44:43
【问题描述】:

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

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

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

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

最好的方法是什么?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

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

    请注意,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 对象中可用。而且,您可以将该会话对象传递给您希望在请求中调用的任何其他函数。

    【讨论】:

    • 是的,他们将是登录用户。我要求服务器知道它正在向哪个用户提供数据,以便我可以通过我的 MongoDB 调用包含他们的 ID,以获取仅与他们相关的数据。实际上,我什至没有想到无论我如何存储全局数据,它对所有用户都是完全相同的。如果我使用像 express-sessions 包这样的方法会怎样?
    • 查看我关于按用户保存数据的答案:stackoverflow.com/a/37504339/1229624
    • 我建议使用 express-session。看看我在答案中添加了什么。
    • @Aminadav - 你为什么要对我发表评论。如果您想对 OP 发表评论,请在原始帖子上提交评论或使用 @ 语法将评论指向您自己对 OP 的回答。
    • 我正在对@Fizzix 发表评论。他在我上面的评论中问了一些问题,我回复了他。
    【解决方案2】:

    您不能使用global 来保存当前登录的用户。问题是所有用户都将拥有相同的global。所以来宾用户将可以访问admin 页面。

    如果你需要在express模块​​之间共享数据,你可以在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
    })
    

    【讨论】:

    • OP 似乎希望跨请求为登录用户存储每个用户的数据。我不明白这是如何实现的。
    • 他没有说他希望它跨请求工作。他说entire app。每个请求,他都应该进行验证,并将用户数据添加到req 对象中。之后,他可以访问整个应用程序(其他路由)的数据,直到请求结束
    猜你喜欢
    • 2011-09-05
    • 2011-01-24
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多