簡體   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