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.

Thomas
quelle

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

jsalonen
quelle
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)
})
Jonatan Lundqvist Medén
quelle
4

Verwenden

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

Dies übergibt jede URL außer /. Es sei denn, es funktioniert bei mir.

Im Allgemeinen

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

(Siehe Wie man ein bestimmtes Wort in Regex negiert? )

Hoffe das hilft

user1872904
quelle
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.

Abhay Shiro
quelle