节点,express.session作为中间件不设置cookie。

问题描述 投票:7回答:2

这个问题涉及 NodeJS + Express - 将会话中间件应用到一些路由上。 我一开始以为可以解决我的问题。但它没有。

我想建立一个网站,在第一个默认页面向用户展示网站需要使用cookie的信息,并让他有可能接受这个信息。因此,我不希望服务器在用户接受之前发送一个设置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第一次被调用时,当处理getlogin.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头就会直接发送,但我不希望这样。

感谢大家的帮助!

node.js session express middleware setcookie
2个回答
1
投票

我在.use的文档中找到了答案。

我不能使用问题的解决方案 NodeJS + Express - 将会话中间件应用到一些路由上。 因为我的中间件的顺序被打乱了。

所以我需要做的是在声明app.use(...)时,指出哪些路由应该使用中间件。在可能的情况下,我想让session的中间件作用于除了''以外的所有路由,所以我的中间件新声明是这样的。

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   
}));
© www.soinside.com 2019 - 2024. All rights reserved.