【问题标题】:Nodejs creating session on every requestNodejs在每个请求上创建会话
【发布时间】:2016-05-21 10:10:37
【问题描述】:

我们正在创建一个需要维护会话的 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。但是两个 api 都显示了不同的会话。任何人都可以指导我们一些关于我们做错了什么吗?

【问题讨论】:

  • 请发布您如何初始化会话。也请张贴从快递发送的标题。
  • 添加了headers和初始化方法
  • 如果我运行curl -v http://localhost:3000/,我会在标题中得到这个答案:set-cookie: connect.sid=s%3AvrxyuLkQ8JHDS7O5kZ9vL9jU0TOPaGip.K3zFYVzopymsz5eXPMEN5pTlaKBHgZso3DJu3EidmW8; Path=/; HttpOnly。请确认 set-cookie 标头是从您的应用发送的。

标签: javascript node.js session


【解决方案1】:

您是否设置了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 会话存储)

【讨论】:

    【解决方案2】:

    由于您使用的是内置的 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 的每个其他请求)上未设置会话 cookie。您的完整设置是否属于这种情况?

    有关此问题的更多信息和可能的解决方法,请阅读我对另一个问题的以下回答:Express-session with passport.js multiple cookies

    【讨论】:

    • 添加代码而不是链接以便更好地解释答案。
    • 我真的没有理由两次发布完全相同的代码和解释,因为这不会使解释本身“更好”。此外,@Sumeet 没有澄清是否在他的设置中设置了多个 cookie,因此不清楚这是否是真正的问题。如果您点击第二个链接 (stackoverflow.com/questions/36112592/…),您将找到一个显示问题的代码示例(包括生成的标头)以及在无法升级时解决问题的代码。
    猜你喜欢
    • 2020-07-13
    • 2021-08-19
    • 2015-07-25
    • 2016-01-18
    • 2021-06-15
    • 2017-09-17
    • 2016-08-07
    • 2011-05-15
    • 2021-04-21
    相关资源
    最近更新 更多