繁体   English   中英

如何在条件中间件中使用Node.js Express会话?

[英]How can I use Node.js Express-session inside a conditional middleware?

var express = require('express')
var parseurl = require('parseurl')
var session = require('express-session')

var app = express()


app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))

这是我的简单代码。 但是,我只想在req.url包含/web使用会话。 有什么办法可以将其包装在我自己的中间件中?

我试过了:

function setSession(req,res,next){
    if(req.url.indexOf('/api') != 0){
        app.use(session({
            secret: 'keyboard cat',
            resave: false,
            saveUninitialized: true
        }));
        next();
    }else{
        next();
    }
};

接着

app.use(setSession);

但是在我的控制器中设置req.session.hello = "world" TypeError: Cannot set property 'hello' of undefined得到: TypeError: Cannot set property 'hello' of undefined 简而言之,它不起作用。 我的论据在我的中间件中是错误的吗?

但是,我只想在req.url包含/ web时使用会话。 有什么办法可以将其包装在我自己的中间件中?

当然可以。 您可以使用express.Router创建子路由,如下所示:

var sessionMiddleware = session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true
});

var webRoutes = express.Router()
    .get('/', function(req, res, next) {
        res.send('I have a session!');
    });

var nonWebRoutes = express.Router()
    .get('/', function(req, res, next) {
        res.send('No session here');
    });


app.use('/web', express.Router()
    .use(sessionMiddleware)
    .use(webRoutes));

app.use('/nonweb', nonWebRoutes);

编辑:

但是,如果您想有条件地执行中间件功能,可以这样做:

app.use(function(req, res, next) {
    if (req.url.indexOf('/api') !== 0) {
        sessionMiddleware(req, res, next);
    } else {
        next();
    }
});

app.get('/api', function(req, res, next) {
    res.send(!!req.session); //false
});

app.get('/web', function(req, res, next) {
    res.send(!!req.session); //true
});

但是我更喜欢子路由方法,因为它将路径路由结构映射到一个层次结构,这使得代码更易于阅读,并且更易于合并使用会话的其他中间件,例如passport.js。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM