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

杰森·霍尔姆(Jason Holm)
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.urlcontains时使用会话/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简而言之,它是行不通的。我的论据在我的中间件中是错误的吗?

安德鲁·拉弗斯(Andrew Lavers)

但是,我只想在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Express JS中使用可选的中间件

Node.js Express如何在中间件之间传递数据?

如何在发布路线上模拟Express / Node.js中间件?

如何在Express中使用原始中间件

如何在中间件中使用 firebase 作为 node.js 的登录身份验证?

在使用 node.js 和 Express 构建的 api 中使用 cors 中间件时出现 CORS 错误

如何在node.js Express中的路由end()之后阻止中间件序列继续进行

如何使用Node.js,Express和更少中间件来编译2种以上的LESS风格?

express.js-会话访问中间件不起作用

游戏与node.js / express的会话数

什么是Node.js的Connect,Express和“中间件”?

Node.js / Express:中间件内部的异步函数?

将中间件放入Node js + Express

Node.js Express - 模块与中间件

在 Express.js 中使用 Firebase 作为身份验证中间件

为什么中间件不能在Express JS中使用

无法使用 express js 检索会话

对 Express / Node.js 使用 favicon 中间件有什么好处?

node.js / express:将router.route()与中间件功能一起使用

如何在express.js中制作中间件的动态链

如何检查正在使用的Express.js中间件集?

如何在Nestjs中使用Express的路由特定中间件?

如何在 Nest.js 中间件中使用 Service

如何在Sails.js中使用自定义路由中间件?(ExpressJS)

在Koa中使用Express中间件

如何在Express JS中管理多个会话

在Express.js中使用next()将变量传递到下一个中间件

如何将中间件路由器用于Express Node.js中的子路径

使用 Node.js / Express 是否可以从 IIFE 内部执行 next() 错误并推进到错误处理中间件?