我们正在创建一个nodejs应用程序,我需要维护会话。我们使用express来维护节点变量。但问题是每当我们点击新服务时,就会创建一个新会话。
app.js文件看起来像这样
var RedisStore = require('connect-redis')(session);
module.exports = function Sessions(url, secret) {
var store = new RedisStore({ url: url });
var session = session({
secret: 'dfsdfdff',
store: 'test',
resave: true,
saveUninitialized: true
});
return session;
};

var express = require('express');
var session = require('express-session');
var routes = require('./routes');
var http = require('http');
var https = require('https');
var path = require('path');
var Q = require('q');
var fs = require('fs');
var formidable = require("formidable");
var util = require('util');
var url = require('url');
var request = require('request');
var users = require('./routes/language');
var user_auth = require('./routes/auth');
auth.js文件看起来像这样
exports.generateToken = function(req, res, next) {
res.render('index', {
page_title: 'PEN_V4'});
var sess = req.session;
sess.user_id = 'Hello1';
console.log('Hello 1============');
console.log(sess.user_id);
console.log('session*****************************============');
console.log(sess);
res.end();
}
exports.myToken = function(req, res, next) {
console.log(req.session);
console.log('session============');
console.log('session*****************************============');
res.end();
}
app.configure(function() {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(__dirname + '/static'));
app.use(express.cookieParser());
app.use(express.session({
secret: 'alessios',
store: MemStore({
reapInterval: 60000 * 10
}),
cookie :{httpOnly: true}
}));
});

然后从index.html我们调用api的myToken和generateToken。但两个apis都展示了不同的会话。请问我们有关我们做错的事情吗?
答案 0 :(得分:0)
您是否设置了express-session
中间件?只需要包装是不够的,你需要使用它,如下所示:
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
app.use(session({
store: new RedisStore(config.redis),
secret: 'w5qTAcEMgNeNzrPg',
proxy: true,
resave: true,
saveUninitialized: true
}));
(在本例中,我使用Redis会话存储)
答案 1 :(得分:0)
当您使用内置的bodyParser和cookieParser时,它们仅包含在4.x之前的Express版本中,我得出结论您使用的是过时版本的Express。升级Express可以解决您的问题(有关从3.x升级到4.x的信息:https://strongloop.com/strongblog/express-3-to-4-migration-guide/)
设置多个cookie时,set-cookie标头似乎存在问题,因此未在第一个请求(或应设置另一个cookie的每个其他请求)上设置session-cookie。这是完整设置的情况吗?
有关该问题和可能的解决方案的更多信息,请阅读我对另一个问题的回答:Express-session with passport.js multiple cookies