我是一名具有PHP背景的Web开发人员,最近搬到了JS。
在PHP中,我们曾经使用$_SESSION
全局变量,使您的会话变量可以从任何地方访问。在你的代码中(很棒的功能!)。
现在,使用ExpressJS应用程序,我使用快速会话包来创建会话变量。
问题是ExpressJS中的会话变量不是全局的,它们是请求对象(req.session
)的属性。因此,它们只能在具有req参数的函数中访问(AKA中间件和路由函数)。
问题是:是否可以在ExpressJS全局PHP中创建会话变量,所以任何'帮助'功能可以处理它们吗?
答案 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会很棘手。