将Express中的特定中间件用于除特定路径之外的所有路径


77

我在带有一些中间件功能的node.js中使用Express框架:

var app = express.createServer(options);
app.use(User.checkUser);

我可以将.use函数与附加参数一起使用,以仅在特定路径上使用此中间件:

app.use('/userdata', User.checkUser);

是否可以使用path变量,以便将中间件用于除特定路径(即根路径)以外的所有路径?

我在想这样的事情:

app.use('!/', User.checkUser);

所以User.checkUser总是被调用,除了根路径。

Answers:


127

我会将checkUser中间件添加到我的除首页之外的所有路径中。

app.get('/', routes.index);
app.get('/account', checkUser, routes.account);

要么

app.all('*', checkUser);

function checkUser(req, res, next) {
  if ( req.path == '/') return next();

  //authenticate user
  next();
}

您可以使用下划线扩展它,以在未经身份验证的路径数组中搜索req.path:

function checkUser(req, res, next) {
  var _ = require('underscore')
      , nonSecurePaths = ['/', '/about', '/contact'];

  if ( _.contains(nonSecurePaths, req.path) ) return next();

  //authenticate user
  next();
}

是否可以允许所有请求到特定路径,但不允许子路径?(即“ /”、“/style.css”、“/background.jpg”,但不是“ / lists /”或“ / titles”)
Thomas Thomas

您的静态资产应放在静态目录之外。
chovy

为什么不只是正则表达式,
每次妳站

13

而不是直接注册User.checkUser为中间件,而是注册一个新的帮助器函数,例如checkUserFilter,该函数在每个URL上都被调用,但是仅在给定URL上将执行传递给userFiled`。例:

var checkUserFilter = function(req, res, next) {
    if(req._parsedUrl.pathname === '/') {
        next();
    } else {
        User.checkUser(req, res, next);
    }
}

app.use(checkUserFilter);

从理论上讲,您可以提供的正则表达式路径app.use。例如:

app.use(/^\/.+$/, checkUser);

在Express 3.0.0rc5上进行了尝试,但是它不起作用。

也许我们可以打开一张新票并建议将此作为功能?


我认为只有v4支持此功能。
Riz-waan

12

您也可以在每个路由上设置中间件。

// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})


3

使用此库称为express-除非

除非路径为index.html,否则要求对每个请求进行身份验证。

app.use(requiresAuth.unless({
  path: [
    '/index.html',
    { url: '/', methods: ['GET', 'PUT']  }
  ]
}))

路径可以是字符串,正则表达式或其中任何一个的数组。它也可以是一个对象数组,它是URL和方法密钥对。如果请求路径或路径和方法匹配,则中间件将不会运行。

该库肯定会为您提供帮助。


0

@chovy的解决方案是最好的。

另一个解决方案是:

我面临着类似的问题。因此,我要做的就是将“路​​由”文件中的功能拆分为不同的文件,然后分别导出它们。同样,我将它们分别导入“服务器”文件中,并为各个路由调用了中间件。但是我不建议大规模使用,我有一个少于10条路线的小项目,所以我不介意这样做。对于缩放,我会选择chovy的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.