app.use()
предназначен для привязки промежуточного программного обеспечения к вашему приложению. Это путь path
« mount » или « prefix », который ограничивает промежуточное программное обеспечение только для всех запрошенных путей, начинающихся с него. Он может даже использоваться для встраивания другого приложения:
// 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'));
// ...
Указывая путь /
« монтирования », вы 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) {
// ...
});
против
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
С несколькими обработчиками для одного маршрута:
app.get('/', authorize('ADMIN'), function (req, res) {
// ...
});
против
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;
// ...
});
против
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
.