除了特定的path,在Express中使用特定的中间件

我在node.js中使用了一些中间件function的Express框架:

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

我可以使用带有附加参数的.use函数来仅在特定path上使用此中间件:

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

是否有可能使用pathvariables,以便中间件用于除特定path之外的所有path,即根path?

我在想这样的事情:

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

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

       

网上收集的解决方案 "除了特定的path,在Express中使用特定的中间件"

我会添加checkUser中间件到我的所有path,除了主页。

 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(); } 

你可以用下划线来扩展它,以search非authenticationpath数组中的req.path:

 function checkUser(req, res, next) { var _ = require('underscore') , nonSecurePaths = ['/', '/about', '/contact']; if ( _.contains(nonSecurePaths, req.path) ) return next(); //authenticate user next(); } 

不是直接注册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.useexpression式path。 比如像这样的东西:

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

尝试了明确3.0.0rc5,但它不起作用。

也许我们可以打开一张新票,并build议这是一个function?

您也可以为每个路由设置一个中间件。

 // 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) }) 

使用

 app.use(/^(\/.+|(?!\/).*)$/, function(req, resp, next){... 

这通过任何url从/。 除非,它适用于我。

一般来说

 /^(\/path.+|(?!\/path).*)$/ 

(请参阅如何否定正则expression式中的特定单词?

希望这可以帮助