ExpressJS 中的会话变量



我是一名具有PHP背景的Web开发人员,最近搬到了JS。

在 PHP 中,我们曾经有 $_SESSION 全局变量,它可以让你的会话变量从代码中的任何"位置"访问(很棒的功能!

现在,使用ExpressJS应用程序,我正在使用快速会话包来创建会话变量。

问题是 ExpressJS 中的会话变量不是全局的,它们是请求对象 ( req.session ( 的属性。因此,它们只能在具有 req 参数的函数(AKA 中间件和路由函数(中访问。

问题是:是否可以在 ExpressJS 全局 ala PHP 中制作会话变量,以便任何"辅助"函数都可以处理它们?

是的,但你不应该这样做。可以通过将属性追加到global对象来创建全局变量。例如:global.someData = req.session.someData ,但global对象类似于 PHP 中的GLOBAL

在这种情况下,特别是如果你有异步函数,一个请求的变量会弄乱为另一个请求运行的代码(例如,Alice 会得到 Bob 的变量(。

好的做法是将req.session对象传递到需要的任何位置并访问它。

您可以使用CLS(Continuation-local-storage(来实现此目的。您所要做的就是创建一个命名空间并将其绑定到每个请求。

现在,将以下代码添加到您的服务器.js您可以在其中初始化服务器

//server.js
var express = require('express');
var app = express();
var createNameSpace = require('continuation-local-storage').createNamespace;
var myNameSpace = createNameSpace('myNameSpace');
// Assign your sessionVariable to each request as 'sessionId'
app.use(function(req, res, next) {
    myNameSpace.run(function() {
        myNameSpace.set('sessionId', sessionVariable);
        next();
    });
});

应用程序中的任何位置添加以下代码以访问会话变量

var getNamespace = require('continuation-local-storage').getNamespace;
var myNameSpace = getNamespace('myNameSpace');
var sessionId = myNameSpace.get('sessionId'); // access your sessionId (sessionVariable)

请注意,使用 CLS 有时可能很棘手。

一旦您的会话变量被设置(在您的登录功能上或您设置它的任何位置(,它就是您的索引.js文件中的全局变量。

我像这样设置我的会话:

var students = {Id: result[key].Id,Username: result[key].Username,Email: result[key].Email,Phone: result[key].Phone,First_Name: result[key].First_Name,Surname: result[key].Surname,RoleName: result[key].RoleName, Company: result[key].CompanyName };
Users.push(students);
req.session.user = students;

您可以通过设置如下所示的变量来访问存储的会话:

var session = req.session.user

这会将会话设置为函数中需要它的会话变量。然后,当您渲染页面时,您只需将会话添加到该渲染中,您就可以在该页面上访问它。

res.render('/', { title: 'Hello World', session: session});

最新更新