it-swarm.com.de

Verwenden Sie in Express für alle Pfade mit Ausnahme eines bestimmten Pfads eine bestimmte Middleware

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

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

Ich kann das .use Funktion mit einem zusätzlichen Parameter, 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 mit Ausnahme eines bestimmten Pfads, d. H. Des Stammpfads, verwendet wird?

Ich denke über so etwas nach:

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

So User.checkUser wird mit Ausnahme des Stammpfads immer aufgerufen.

57
Thomas

Ich würde checkUser Middleware allen meinen Pfaden hinzufügen, außer der 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();
}
92
chovy

Anstatt sich direkt zu registrieren User.checkUser Registrieren Sie als Middleware eine neue Hilfsfunktion, z. B. checkUserFilter, die für jede URL aufgerufen wird, deren 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 Regexp-Pfade für 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 öffnen und dies als Feature vorschlagen?

8
jsalonen

Sie können für jede Route auch eine Middleware festlegen.

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

Verwenden

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

Hierdurch werden alle URLs außer/weitergegeben. Es sei denn, es funktioniert bei mir.

Im Allgemeinen

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

(Siehe Wie negiere ich ein bestimmtes Wort in Regex? )

Hoffe das hilft

2
user1872904

Verwenden Sie diese Bibliothek mit dem Namen Express-Es sei denn

Fordern Sie für jede Anforderung eine Authentifizierung an, 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 weiterhelfen.

1
Abhay Shiro