![](/img/trans.png)
[英]How can I set presistent cookies on node.js with express-session?
[英]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.