app.use()
призначений для прив'язки проміжного програмного забезпечення до вашої програми. Шлях path
- це " mount " або " префікс " і обмежує проміжне програмне забезпечення застосовуватися лише до будь-яких запитуваних шляхів, які починаються з нього. Його можна використовувати навіть для вбудовування іншого додатка:
// 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'));
// ...
Вказавши /
як шлях " mount ", app.use()
відповість на будь-який шлях, який починається з /
якого є всі вони, і незалежно від використовуваного дієслова HTTP:
GET /
PUT /foo
POST /foo/bar
- тощо.
app.get()
, з іншого боку, є частиною маршрутизації програми Express і призначений для узгодження та обробки конкретного маршруту, коли запитується за допомогою GET
дієслова HTTP:
І еквівалентною маршрутизацією для вашого прикладу app.use()
насправді буде:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
( Оновлення: Спроба краще продемонструвати відмінності. )
Методи маршрутизації, в тому числі app.get()
, - це зручні методи, які допомагають точніше вирівняти відповіді на запити. Вони також додають у підтримку таких функцій, як параметри та next('route')
.
Всередині кожного app.get()
є заклик до app.use()
, тому ви, звичайно, все це можете зробити app.use()
безпосередньо. Але це часто вимагає (можливо, зайвого) повторного доповнення різної кількості кодового коду.
Приклади:
Для простих, статичних маршрутів:
app.get('/', function (req, res) {
// ...
});
vs.
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
З кількома обробниками для одного маршруту:
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);
// ...
});
});
З параметрами:
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;
// ...
});
Примітка: реалізація Express 'цих функцій містяться в його Router
, Layer
іRoute
.