app.use()
jest przeznaczony do wiązania oprogramowania pośredniego z aplikacją. Jest path
to ścieżka „ montowania ” lub „ prefiksu ” i ogranicza oprogramowanie pośrednie do stosowania tylko do żądanych ścieżek, które zaczynają się od niego. Można go nawet użyć do osadzenia innej aplikacji:
// 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'));
// ...
Określając /
jako ścieżkę „ mount ”, app.use()
odpowie na każdą ścieżkę, która zaczyna się od /
, które są wszystkie i niezależnie od użytego czasownika HTTP:
GET /
PUT /foo
POST /foo/bar
- itp.
app.get()
, z drugiej strony, jest częścią routingu aplikacji Express i jest przeznaczony do dopasowywania i obsługi określonej trasy na żądanie GET
czasownika HTTP:
Odpowiednim routingiem dla Twojego przykładu app.use()
byłoby:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
( Aktualizacja: Próba lepszego wykazania różnic. )
Metody routingu, w tym app.get()
, są wygodnymi metodami, które pomagają precyzyjniej dopasowywać odpowiedzi na żądania. Dodają także obsługę takich funkcji, jak parametry i next('route')
.
Wewnątrz każdego app.get()
jest wezwanie do app.use()
, więc z pewnością możesz to wszystko zrobić app.use()
bezpośrednio. Ale zrobienie tego często będzie wymagało (prawdopodobnie niepotrzebnie) zaimplementowania różnych ilości kodu płyty głównej.
Przykłady:
W przypadku prostych, statycznych tras:
app.get('/', function (req, res) {
// ...
});
vs.
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
Z wieloma modułami obsługi dla tej samej trasy:
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);
// ...
});
});
Z parametrami:
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;
// ...
});
Uwaga: wdrożenie Express' z tych funkcji są zawarte w jego Router
, Layer
iRoute
.