我是一名具有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});