我已经使用Express.js设置了一个Node.js测试服务器,如下所示:
var express = require('express');
var MemoryStore = express.session.MemoryStore;
var app = express.createServer();
app.configure(function() {
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(app.router);
app.use(express.session({
store: new MemoryStore(),
secret: 'secret',
key: 'bla'
}));
});
app.get('/', function(req, res){
console.log(req.session);
res.end("html");
});
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)
为什么console.log(req.session)打印出undefined?我没有正确使用它吗?为了将变量保存到用户的会话,我需要做什么?
客户端收到一个存储为其cookie的SID,但我无法分配任何属性req.session,因为它没有定义.感谢您提供解决此问题的任何提示!:-)
这是我正在使用的版本:
??? express@2.5.9
? ??? connect@1.8.7
? ? ??? formidable@1.0.9
? ??? mime@1.2.4
? ??? mkdirp@0.3.0
? ??? qs@0.4.2
Run Code Online (Sandbox Code Playgroud) 我有一个非常小的快递应用程序来说明我遇到的问题.
我在我的快递应用程序上使用connect-redis作为会话存储.我有一个问题,只是连接到它.只需打印出req.session.store结果undefined如下所示:
const session = require('express-session')
const app = require('express')()
const RedisStore = require('connect-redis')(session);
const isDev = process.env.NODE_ENV !== 'production'
app.use(session({
store: new RedisStore({
host: 'localhost',
port: 6379
}),
secret: 'super-secret-key', // TBD: grab from env
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 1000 * 60 * 60 * 24,
secure: !isDev, // require HTTPS in production
}
}))
app.get('/', (req, res) => {
console.log('**testing**')
console.log(req.session.store)
res.send('rendering this text')
})
app.listen(3001, () => { …Run Code Online (Sandbox Code Playgroud) 首先抱歉我的英语不好.我正在学习,我正在做一个学术项目并遇到了一个问题.我记不起会话变量了.
的package.json
"dependencies": {
"body-parser": "^1.7.0",
"ejs": "~1.0.0",
"express": "^4.8.7",
"express-session": "^1.11.3",
"ini": "^1.3.4",
"mysql": "^2.8.0",
"winston": "^1.0.1"
}
Run Code Online (Sandbox Code Playgroud)
server.js
var express = require('express');
var session = require('express-session');
var app = express();
...
require('./router/main')(app, language, connection, logger);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);
app.use(express.static(__dirname + '/public'));
app.use(session({
secret: 'pecuniamsekretsession',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
Run Code Online (Sandbox Code Playgroud)
main.js
module.exports = function(app, languageItems, connection, logger) {
app.post('/', require('../router/login.js')(languageItems, connection, logger));
app.get('/', require('../router/login.js')(languageItems, connection, logger));
}
Run Code Online (Sandbox Code Playgroud)
login.js …
我知道这个问题已被问过好几次了.但是,我读过的答案都没有解决我的问题.
其中许多已经过时用于快递v4,因为快递会议目前是一个单独的模块.那些问题/答案在这里:
其他问题已更新,但是给出的解决方案并不能解决我的问题.那些问题/答案在这里:
大多数解决方案是配置应用程序时的中间件序列.我尝试了不同的选项,但我找不到正确的方法.也许就是这样.
在其他解决方案中,有人说session中间件无法被调用,因为如果是,req.session则会被定义.我在之前使用过中间件app.use(session({...})),并检查两者是否被调用.
我也在这个问题中发现有人说他req.session在商店断开连接时未定义.到目前为止我正在使用默认商店.这可能是问题吗?
我收到这个错误:
TypeError:无法读取undefined的属性'destroy'
当我尝试使用req.session.destroy()login.js 注销会话时它会中断(请参阅下面的代码)
server.js
const express = require('express');
const session = require('express-session');
const mongo = require('mongodb');
const passport = require('passport');
const path = require('path');
const routes = require('./app/routes');
const login = require('./app/routes/login.js');
const app = express();
app.use(session({
secret: 'key',
resave: false,
saveUninitialized: true,
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/public', express.static(path.normalize('./public')));
app.use(routes);
app.use(login);
app.set('view engine', 'pug'); …Run Code Online (Sandbox Code Playgroud)