Nodejs在每个请求上创建会话

时间:2016-02-10 20:54:03

标签: javascript node.js session

我们正在创建一个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都展示了不同的会话。请问我们有关我们做错的事情吗?

2 个答案:

答案 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