这个问题与NodeJS + Express - Apply session middleware to some routes有关,我首先想到这会解决我的问题。但它没有。
我正在尝试构建一个网站,其中第一个默认页面显示有关需要使用Cookie的网站的用户信息,并让他有可能接受此操作。因此,我不希望服务器在用户接受之前发送set-cookie标头。
正如上面问题的解决方案一样,我现在尝试将会话作为中间件插入到应该拥有它的路由中。问题是,这样做我从来没有从服务器获得任何set-cookie标头。用Fiddler检查了这个。
我的代码看起来像这样(只有相关部分):
var express = require('express');
var app = express();
var session = require('express-session');
var mongoose = require('mongoose');
var configDB = require('./config/database.js');
var mongoStore = require('connect-mongo')(session);
mongoose.connect(configDB.url);
var mongoSessionStore = new mongoStore({
mongoose_connection: mongoose.connections[0]
});
.
.
.
var sessionMiddleware = session({
secret: 'secret',
store: mongoSessionStore,
key: 'express.sessionID',
cookie: {domain: 'the-domain', path: '/', httpOnly: true, secure: false, maxAge: null },
saveUninitialized: false,
resave: false
});
require('./app/routes.js')(app, passport, sessionMiddleware);
路线看起来像这样,在单独的文件中:
module.exports = function(app, passport, sessionMiddleware) {
app.get('/', loginIsLoggedIn, function(req, res) {
res.render('cookie.ejs');
});
app.post('/', function(req, res) {
if(req.body.cookieAnswer == "Accept"){
res.redirect('/login');
} else {
res.render('cookie.ejs', {cookieMsg: req.body.cookieAnswer});
}
});
app.get('/login', sessionMiddleware, loginIsLoggedIn, function(req, res) {
res.render('login.ejs', {successMsg: res.locals.success_message, errorMsg: res.locals.error_message});
});
app.post('/login', sessionMiddleware, passport.authenticate('local-login', {
successRedirect : '/auth',
failureRedirect : '/login',
failureFlash : true // allow flash messages
}));
我希望当第一次调用sessionmiddleware时,当处理获取'login.ejs'时,它会在响应中生成set-cookie标头,但这里有一些我不知道的东西。
如果我设置这样的中间件:
app.use(session({
secret: 'secret',
store: mongoSessionStore,
key: 'express.sessionID',
cookie: {domain: 'the-domain', path: '/', httpOnly: true, secure: false, maxAge: null },
saveUninitialized: false,
resave: false
}));
进入网站时会直接发送set-cookie标头,但我不希望这样。
感谢任何帮助!
答案 0 :(得分:0)
我在.use。
的文档中找到了答案我无法使用问题NodeJS + Express - Apply session middleware to some routes的解决方案,因为我的中间件的排序当时搞砸了。
所以我需要做的是指出在声明app.use时哪些路由应该使用中间件(... 在可能的情况下,我希望会话的中间件在除了' /'之外的所有路由上起作用。所以我的中间件新声明如下:
var routesArray = ['/login', '/auth', '/signup', '/email', '/chPassW', '/logout', '/snapshot'];
app.use(routesArray, session({
secret: 'secret',
store: mongoSessionStore,
key: 'express.sessionID',
cookie: {domain: 'the-domain', path: '/', httpOnly: true, secure: false, maxAge: null },
saveUninitialized: false,
resave: false
}));