特定路线的快速设置会话

Express Set Session for Specific Routes

我正在尝试仅包括某些路由(身份验证路由)的会话,但由于错误页面路由,我遇到了问题:

我有这个:

    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]); 

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

提前致谢

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

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

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
}));

您可以做的其他事情:

  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();
    }
});

您还可以使用 Express.router() chain/compose 多个中间件,如本示例中所述:Express: composing middleware

然后应用那个组成的路由器(链式中间件)作为特定的路由处理程序。