我正在尝试使用 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/