app.use()
dient zum Binden von Middleware an Ihre Anwendung. Dies path
ist ein " Mount " - oder " Präfix " -Pfad und beschränkt die Middleware darauf, nur auf alle angeforderten Pfade anzuwenden, die damit beginnen . Es kann sogar verwendet werden, um eine andere Anwendung einzubetten:
// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();
app.use('/subapp', require('./subapp'));
// ...
Wenn Sie /
einen " Mount " -Pfad angeben, app.use()
wird auf jeden Pfad reagiert, der mit beginnt /
, und zwar alle und unabhängig vom verwendeten HTTP-Verb:
GET /
PUT /foo
POST /foo/bar
- etc.
app.get()
Andererseits ist es Teil des Anwendungsroutings von Express und dient zum Abgleichen und Behandeln einer bestimmten Route, wenn dies mit dem GET
HTTP-Verb angefordert wird :
Und das äquivalente Routing für Ihr Beispiel app.use()
wäre tatsächlich:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
( Update: Versuch, die Unterschiede besser zu demonstrieren. )
Die Routing-Methoden, einschließlich app.get()
, sind praktische Methoden, mit denen Sie Antworten auf Anforderungen genauer ausrichten können. Sie unterstützen auch Funktionen wie Parameter und next('route')
.
In jedem app.get()
ist ein Aufruf an app.use()
, so dass Sie all dies sicherlich app.use()
direkt mit tun können. Dies erfordert jedoch häufig (wahrscheinlich unnötig) die Neuimplementierung verschiedener Mengen von Boilerplate-Code.
Beispiele:
Für einfache, statische Routen:
app.get('/', function (req, res) {
// ...
});
vs.
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
Mit mehreren Handlern für dieselbe Route:
app.get('/', authorize('ADMIN'), function (req, res) {
// ...
});
vs.
const authorizeAdmin = authorize('ADMIN');
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
authorizeAdmin(req, res, function (err) {
if (err) return next(err);
// ...
});
});
Mit Parametern:
app.get('/item/:id', function (req, res) {
let id = req.params.id;
// ...
});
vs.
const pathToRegExp = require('path-to-regexp');
function prepareParams(matches, pathKeys, previousParams) {
var params = previousParams || {};
// TODO: support repeating keys...
matches.slice(1).forEach(function (segment, index) {
let { name } = pathKeys[index];
params[name] = segment;
});
return params;
}
const itemIdKeys = [];
const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
app.use('/', function (req, res, next) {
if (req.method !== 'GET') return next();
var urlMatch = itemIdPattern.exec(req.url);
if (!urlMatch) return next();
if (itemIdKeys && itemIdKeys.length)
req.params = prepareParams(urlMatch, itemIdKeys, req.params);
let id = req.params.id;
// ...
});
Hinweis: Express' Implementierung dieser Funktionen in seiner enthalten sind Router
, Layer
undRoute
.