针对特定路由的快速设置会话

Ber*_*rdo 1 routing node.js express express-session

我试图只包括一些路由(身份验证)的会话,但由于错误页面路由我遇到了问题:

我有这个:

    app.use(session({
        secret: config.secrets.session,
        saveUninitialized: false,
        resave: false,
        store: sessionStore,
        proxy: true,
        cookie: {
            maxAge: config.token_duration,
            secure: false
        }
        // rolling: false
    }));


    app.use('/api/user', require('./api/user'));
    app.use('/api/auth', require('./api/auth'));  

    app.route(['/error/500','/error/404','/user/settings'])
        .get((req, res) => {
            res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
        });

    app.route('/*/*')
        .get(errors[404]);       

    app.use(errors[500]); 
Run Code Online (Sandbox Code Playgroud)

所以,如果我像这样使用它,我的应用程序中的所有页面都将创建一个会话(我不想要).如果我在错误路由之后移动会话部分,我将永远不会到达api路由,因为它将到达404路由.

提前致谢

jfr*_*d00 5

中间件只能与某些路由相关联,并且其中指定的顺序很重要.有很多方法可以做到这一点,如何最好地实现它取决于您的站点使用的路径以及如何最容易地在路径之间创建链接以及它是否应该或不应该具有会话中间件.

一个简单的事情是在会话中间件之前放置错误路由处理程序.然后,那些路由处理程序将首先"处理"请求,并且永远不会调用会话中间件.

app.route(['/error/500','/error/404','/user/settings'])
    .get((req, res) => {
        res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
    });

app.use(session({
    secret: config.secrets.session,
    saveUninitialized: false,
    resave: false,
    store: sessionStore,
    proxy: true,
    cookie: {
        maxAge: config.token_duration,
        secure: false
    }
    // rolling: false
}));
Run Code Online (Sandbox Code Playgroud)

你可以做的其他事情:

  1. 在会话中间件上放置一个路径,以便仅为您站点中的某些路径调用它(所有经过身份验证的页面都应该在该路径下方).

  2. 创建自己的中间件处理程序,检查路径是否存在/error,如果没有,则调用会话中间件处理程序.如果是/error,则不要调用会话中间件.

最后一个可以这样做:

const sessionHandler = session({
    secret: config.secrets.session,
    saveUninitialized: false,
    resave: false,
    store: sessionStore,
    proxy: true,
    cookie: {
        maxAge: config.token_duration,
        secure: false
    }
    // rolling: false
});

app.use(function(req, res, next) {
    // if path does not start with /error/, then invoke session middleware
    if (req.url.indexOf("/error/") !== 0) {
        return sessionHandler(req, res, next);
    } else {
        next();
    }
});
Run Code Online (Sandbox Code Playgroud)