在与ejs和节点js的会话中存储变量

时间:2018-07-18 19:28:15

标签: node.js express session-variables

我正在尝试解决以下问题的解决方案: 我有一个变量,需要针对页面上的每个唯一访问者将其分开。它只是访问者单击页面上某些项目时填写的简单列表。每次唯一访问都将为空。 目前,我将其保留在后端,这是一个非常糟糕的解决方案,因为当前使用该应用程序的每个人都将添加到同一列表中

后端代码:

thelist=[]

app.get("/show/:id", function (req, res) {
 var id = req.params.id;
 thelist.push(id)
 console.log(thelist);
 res.redirect('/')
});

app.get("/run", function(req, res) {
 res.render("data", {data: thelist})
 thelist = []
});

主要要点是列表thelist然后传递到python脚本,该脚本也通过node.js连接到应用程序中。因此,我需要该变量留在后端。 我也想保持简单,因此我不想强迫用户创建帐户来使用该应用程序,因此我正在寻找某种cookie /缓存/任何其他形式的会话存储。

5 个答案:

答案 0 :(得分:1)

这里最好的解决方案是快速会话https://github.com/expressjs/session

当我看到您的代码时,我可以确定您正在使用 express 。如果您使用的是express,那么下面的代码就足够了。

这是使用最少的代码即可实现所需内容的最简单方法:

示例:

app.set('oneSetting', 'one');
console.log(app.settings.oneSetting);

OR

   app.set('port', 3000);

   app.get('port'); //3000

您也可以在req对象中访问相同的变量,例如:

req.app.get('port')

答案 1 :(得分:0)

您可以创建一个会话映射(例如哈希映射)。我已经将其集成到我的一个项目中,并且可以正常工作。下面是它的代码以及如何访问它:

hashmap.js

var hashmapSession = {};

exports.auth = auth = {
  set : function(key, value){
    hashmapSession[key] = value;
  },
  get : function(key){
    return hashmapSession[key];
  },
  delete : function(key){
    delete hashmapSession[key];
  },
  all : function(){
    return hashmapSession;
  }
};

app.js

var hashmap = require('./hashmap');
var testObj = { id : 1, name : "john doe" };

hashmap.auth.set('test', testObj);
hashmap.auth.get('test');
hashmap.auth.all();
hashmap.auth.delete('test');

您可以使用此方法作为节点应用程序的会话存储。请记住,此存储将仅在当前会话中是持久的。

答案 2 :(得分:0)

为什么不使用快速会话。

您可以像下面这样使用它:

App.js

var app = express();
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}))

Controller.js

//Sets the id in the session object.
app.get('/show/:id', function (request, response, next) {
  request.session.id = id;
})

//Retrieve the id from the session object.
app.get('/showMyId',function(request,response,next)){
  response.send(request.session.id;);
})

这样,您不必管理全局列表,所有ID都将显示在它们各自的会话对象中。

这种方法使用cookie会话,还可以使用其他策略来像适当的存储服务器一样存储会话对象。

答案 3 :(得分:0)

据我了解,您正在尝试为您的应用计算不重复访问者的数量。

您可以使用简单的cookie来跟踪使用情况并设置有效期限,这样就不会删除cookie。

Express具有cookie parser模块,该模块将自动解析cookie。

thelist={}

var express      = require('express')
var cookieParser = require('cookie-parser')
 
var app = express()
app.use(cookieParser())

app.get("/show/:id", function (req, res) {
 var visitorId = req.cookies.visitorid;
 var id = req. params.id
 if(!req.cookies[id]){
  ///create unique id like GUID or something which allows you to uniquely identify user
  if(!visitorId){
    visitorId = '<GUID>';
  }
  if(!thelist[visitorId]){
    thelist[visitorId] = [];
  }
  thelist[visitorId].push(id);
  console.log(thelist);
 }
 res.cookie('visitorid',visitorId, { maxAge: 900000, httpOnly: true }); //You can extend max age as required. Setting up every time will also extend expiry.
 res.cookie(id,'visited', { maxAge: 900000, httpOnly: true }); //set cookie with id saying this is allready visited
 res.redirect('/')
});

app.get("/run", function(req, res) {
 res.render("data", {data: thelist})
 thelist = []
});

答案 4 :(得分:-1)

您可以在窗口会话中使用sessiontorage

sessionStorage.setItem(KEY,VALUE);