除了特定的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。
我会添加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.use
expression式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式中的特定单词?
希望这可以帮助