ExpressJS中的会话变量

时间:2018-04-20 08:01:08

标签: javascript node.js express session express-session

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

在PHP中,我们曾经使用$_SESSION全局变量,使您的会话变量可以从任何地方访问。在你的代码中(很棒的功能!)。

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

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

问题是:是否可以在ExpressJS全局PHP中创建会话变量,所以任何'帮助'功能可以处理它们吗?

2 个答案:

答案 0 :(得分:0)

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

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

好的做法是在需要的任何地方传递req.session对象并访问它。

答案 1 :(得分:0)

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

现在,将以下代码添加到您初始化服务器的server.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();
    });
});

在您的应用程序中的任何位置添加以下代码以访问您的sessionVariable

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

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