我正在尝试解决以下问题的解决方案: 我有一个变量,需要针对页面上的每个唯一访问者将其分开。它只是访问者单击页面上某些项目时填写的简单列表。每次唯一访问都将为空。 目前,我将其保留在后端,这是一个非常糟糕的解决方案,因为当前使用该应用程序的每个人都将添加到同一列表中
后端代码:
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 /缓存/任何其他形式的会话存储。
答案 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);