Verwenden Sie in Express eine bestimmte Middleware für alle Pfade außer einem bestimmten


73

Ich verwende das Express-Framework in node.js mit einigen Middleware-Funktionen:

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

Ich kann das benutzen .use Funktion mit einem zusätzlichen Parameter verwenden, um diese Middleware nur auf bestimmten Pfaden zu verwenden:

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

Ist es möglich, die Pfadvariable so zu verwenden, dass die Middleware für alle Pfade außer einem bestimmten verwendet wird, dh für den Stammpfad?

Ich denke über so etwas nach:

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

Wird User.checkUseralso bis auf den Root-Pfad immer aufgerufen.

Antworten:


122

Ich würde checkUser Middleware zu allen meinen Pfaden hinzufügen, außer zur Homepage.

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

oder

app.all('*', checkUser);

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

  //authenticate user
  next();
}

Sie können dies mit einem Unterstrich erweitern, um in einem Array nicht authentifizierter Pfade nach dem req.path zu suchen:

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

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

  //authenticate user
  next();
}

Ist es möglich, alle Anforderungen für einen bestimmten Pfad zuzulassen, nicht jedoch für die Unterpfade? (dh '/', '/style.css', '/background.jpg', aber nicht '/ lists /' oder '/ title')
Thomas

Ihre statischen Assets sollten aus einem statischen Verzeichnis bereitgestellt werden.
Chovy

warum nicht einfach Regex, Sperma
Martian2049

13

Anstatt sich direkt User.checkUserals Middleware zu registrieren, registrieren Sie beispielsweise eine neue checkUserFilterHilfsfunktion, die für jede URL aufgerufen wird, die Ausführung jedoch nur für bestimmte URLs an userFiled übergeben wird. Beispiel:

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

app.use(checkUserFilter);

Theoretisch könnten Sie reguläre Ausdruckspfade zu bereitstellen app.use. Zum Beispiel so etwas wie:

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

Versuchte es auf Express 3.0.0rc5, aber es funktioniert nicht.

Vielleicht könnten wir ein neues Ticket eröffnen und dies als Feature vorschlagen?


11

Sie können die Middleware auch auf jeder Route einstellen.

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


2

Verwenden Sie diese Bibliothek namens Express - es sei denn

Für jede Anforderung ist eine Authentifizierung erforderlich, es sei denn, der Pfad lautet index.html.

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

Pfad kann eine Zeichenfolge, ein regulärer Ausdruck oder ein Array von diesen sein. Es kann sich auch um ein Array von Objekten handeln, bei denen es sich um URL- und Methodenschlüsselpaare handelt. Wenn der Anforderungspfad oder der Pfad und die Methode übereinstimmen, wird die Middleware nicht ausgeführt.

Diese Bibliothek wird Ihnen sicherlich helfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.