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
contains时使用会话/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
。简而言之,它是行不通的。我的论据在我的中间件中是错误的吗?
但是,我只想在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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句