带有自定义 sessionID 错误的 node.js Express 4 session

标签 node.js session express

我正在尝试使用 mongo 数据库中的 session ID 作为 express-session 中的 sessionID,并将这些详细信息存储在 connect-redis session 存储中。

我不断收到“TypeError:需要 cookie”

这似乎是一个错误,但有人可以检查我的逻辑吗:

我已将代码精简到只剩下骨架,并删除了创建问题不需要的任何内容。

'use strict';


var express       = require('express'),
    session       = require('express-session'),
    redisStore    = require('connect-redis')(session),
    bodyParser    = require('body-parser'),
    app           = express();


app.use(session({
  name: 'test',
  genid: function(req) {
    if (typeof req.sessionID != 'undefined') return req.sessionID;
  },
  cookie: {
    httpOnly: false,
    path: '/',
    maxAge: null
  },
  resave: false,
  saveUninitialized: false,
  secret: 'finbarboobar',
  store: new redisStore({
    host: 'localhost',
    port: 6379,
    prefix: 'kTest:'
  })
}));


app.use(bodyParser.urlencoded({ extended: false }));


//router


app.route(['/'])
  .get(function(req, res) {
    if (req.session.email) return res.redirect('/admin');
    res.send('<h1>Login</h1><form action="/login" method="POST" accept-charset="UTF-8" ><input placeholder="Enter Email" name="email" type="email" autofocus="autofocus"><input type="submit" value="sign in"></form>');

  });


app.route(['/login'])
  .post(function(req, res) {
    req.sessionID = 1;
    req.session.regenerate(function(error) {
      if (error) {
        console.log(error);
      } else {
        req.session.email = req.body.email;
        res.redirect('/admin');
      }
    });
});


app.get('/admin', function(req, res) {
  if (req.session.email) {
    res.send('<h1>Hello ' + req.session.email + '</h1><a href="/logout">logout</a>');
  } else {
    res.redirect('/');
  }
});


app.get('/logout', function(req, res) {
  req.session.destroy(function(error) {
    if (error) {
      console.log(error);
    } else {
      res.redirect('/');
    }
  })
});


app.listen(3001);

感谢您查看此内容。

最佳答案

此处的问题是 Express-Session 包中的一个错误,已在 github 上得到解决。

问题在于 req.sessionID 必须是字符串。因此,在上面的示例中,我发送了一个号码,在原始代码中我发送了一个 mongoDB._id 对象。

上述问题的解决方案是使用:

req.sessionID = "1";

真正问题的解决方案是使用:

req.sessionID = mongoDBSession._id.toString();

我希望这能在某个时候帮助其他人解决这些问题。

关于带有自定义 sessionID 错误的 node.js Express 4 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27250525/

相关文章:

node.js - 定时器删除记录+一个条件

javascript - 使用 async/await 时的 Nodejs : How to avoid nested . then()

node.js - 如何使用connection.db.collection函数?

java - 如何在 weblogic 中共享 session

c# - HttpContext.Current.User 对于无状态 session 安全吗?

node.js - 如何在未捕获的异常上优雅地重新启动 NodeJS 服务器?

javascript - express 服务器没有响应

javascript - Nodejs 重构 if 条件函数

java - 如何检查使用@SessionAttributes创建的 session 是否存在(Spring MVC)

mysql - TypeError : Router. use() 需要一个中间件函数但得到一个对象(NodeJs、Express 和 Mysql)