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 .