Используйте специальное промежуточное программное обеспечение в Express для всех путей, за исключением определенного
Я использую фреймворк Express в node.js с некоторыми функциями промежуточного слоя:
var app = express.createServer(options);
app.use(User.checkUser);
Я могу использовать функцию .use
с дополнительным параметром для использования этого промежуточного программного обеспечения только по определенным путям:
app.use('/userdata', User.checkUser);
Можно ли использовать переменную пути, чтобы промежуточное ПО использовалось для всех путей, кроме определенного, т.е. корневого пути?
Я думаю о чем-то вроде этого:
app.use('!/', User.checkUser);
Так что User.checkUser
всегда вызывается за исключением корневого пути.
Ответы
Ответ 1
Я бы добавил промежуточное ПО 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();
}
Ответ 2
Вместо того, чтобы напрямую регистрировать User.checkUser
в качестве промежуточного программного обеспечения, зарегистрируйте новую вспомогательную функцию, скажем checkUserFilter
, которая вызывается на каждый URL-адрес, но передается выполнение для userFiled` только по заданным URL-адресам. Пример:
var checkUserFilter = function(req, res, next) {
if(req._parsedUrl.pathname === '/') {
next();
} else {
User.checkUser(req, res, next);
}
}
app.use(checkUserFilter);
В теории вы могли бы предоставить regexp-пути к app.use
. Например, например:
app.use(/^\/.+$/, checkUser);
Пробовал его на express 3.0.0rc5, но он не работает.
Возможно, мы могли бы открыть новый билет и предложить это как функцию?
Ответ 3
Вы также можете установить промежуточное ПО по каждому маршруту.
// 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)
})
Ответ 4
Использование
app.use(/^(\/.+|(?!\/).*)$/, function(req, resp, next){...
Это передает любой URL-адрес, отличный от /. Если это не работает, то для меня это работает.
В общем
/^(\/path.+|(?!\/path).*)$/
(см. Как отменить определенное слово в регулярном выражении?)
Надеюсь, что это поможет