app.use()dient zum Binden von Middleware an Ihre Anwendung. Dies pathist 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 GETHTTP-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, LayerundRoute .