Подтвердить что ты не робот

Используйте специальное промежуточное программное обеспечение в 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 всегда вызывается за исключением корневого пути.

4b9b3361

Ответ 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)
})