express()
express()Используется для создания приложения Express.express()Метод представляет собойexpressметод верхнего уровня, экспортируемый модулем.
var express = require('express');
var app = express();
Методы
express.static(root, [options])
express.staticЭто единственное встроенное промежуточное ПО в Express. Оно основано наserver-staticмодуле и отвечает за размещение статических ресурсов в приложениях Express.root— это корневой каталог, в котором находятся статические ресурсы.optionsявляется необязательным и поддерживает следующие свойства:
| Свойство | Описание | Type | Значение по умолчанию |
|---|---|---|---|
| dotfiles | Определяет, следует ли отвечать на dotfiles. Доступные значения: "allow", "deny" и "ignore". | String | "ignore" |
| etag | Включить или отключить etag. | Boolean | истина |
| extensions | Установить резервный вариант расширения файла. | Boolean | истина |
| index | Отправлять индексный файл каталога. Установите false, чтобы не отправлять. | Mixed | "index.html" |
| lastModified | Установить время последнего изменения файла в системе в заголовокLast-Modified. Возможные значения:falseиtrue。 | Boolean | истина |
| maxAge | Установить в заголовке Cache-Control атрибутmax-ageс точностью в миллисекундах (ms) или в виде строкиms format. | Number | 0 |
| redirect | Если запрошенный путь является каталогом, перенаправлять на завершающий "/". | Boolean | истина |
| setHeaders | Метод для установки заголовков при ответе на запросы статических файлов. | Функция |
Если вы хотите узнать больше об использовании промежуточного ПО, обратитесь кОбслуживание статических файлов в Express。
Application()
appОбъект app обычно представляет приложение Express. Он создается путем вызова метода верхнего уровняexpress(), экспортируемого модулем Express:
var express = require('express');
var app = express();
app.get('/', function(req, res) {
res.send('hello world!');
});
app.listen(3000);
Объект app имеет следующие методы:
- Маршрутизирует HTTP-запросы; подробности см. вapp.METHODиapp.paramэтих двух примерах.
- Настраивает промежуточное ПО; подробности см. вapp.route。
- Отображает HTML-представления; подробности см. вapp.render。
- Регистрирует шаблонизаторы; подробности см. вapp.engine。
У него также есть некоторые настройки свойств, которые могут изменить поведение приложения. Для получения дополнительной информации см.Настройки приложения。
Свойства
app.locals
Объект app.locals — это объект JavaScript, а его свойства являются локальными переменными приложения.
app.locals.title // => 'My App' app.locals.email // => '[email protected]'
После установки значения свойствapp.localsсохраняются на протяжении всего жизненного цикла приложения. В противоположность этому,res.localsдействителен только в течение жизненного цикла текущего запроса.
В приложении эти локальные переменные можно использовать при рендеринге шаблонов. Они очень полезны для предоставления шаблонам полезных методов и данных уровняapp. Черезreq.app.locals(см.req.app), локальные переменные можно использовать в middleware.
app.locals.title = 'My App';
app.locals.strftime = require('strftime');
app.locals.email = '[email protected]';
app.mountpath
app.mountpathСвойство — это шаблон пути, по которому монтируется подприложение.
Подприложение — это экземплярexpress, который можно использовать как обработчик маршрута для обработки запросов.
var express = require('express');
var app = express(); // the main app
var admin = express(); // the sub app
admin.get('/', function(req, res) {
console.log(admin.mountpath); // /admin
res.send('Admin Homepage');
});
app.use('/admin', admin); // mount the sub app
Это похоже на свойствоreq.baseUrlобъекта req, с той разницей, что req.baseUrl — это совпавший URL-путь, а не совпавший шаблон. Если подприложение смонтировано по нескольким шаблонам пути, app.mountpath — это список элементов шаблонов пути монтирования, как показано в следующем примере.
var admin = express();
admin.get('/', function (req, res) {
console.log(admin.mountpath); // [ '/adm*n', '/manager' ]
res.send('Admin Homepage');
});
var secret = express();
secret.get('/', function (req, res) {
console.log(secret.mountpath); // /secr*t
res.send('Admin Secret');
});
admin.use('/secr*t', secret); // load the 'secret' router on '/secr*t', on the 'admin' sub app
app.use(['/adm*n', '/manager'], admin); // load the 'admin' router on '/adm*n' and '/manager', on the parent app
Events
app.on('mount', callback(parent))
Когда подприложение монтируется в родительское приложение, генерируется событие mount. Объект родительского приложения передаётся в качестве аргумента в метод callback.
var admin = express();
admin.on('mount', function(parent) {
console.log('Admin Mounted');
console.log(parent); // refers to the parent app
});
admin.get('/', function(req, res) {
res.send('Admin Homepage');
});
app.use('/admin', admin);
Методы
app.all(path, callback[, callback ...]
app.allЭтот метод похож на стандартные методыapp.METHOD(), за исключением того, что он соответствует всем HTTP-глаголам. Он очень полезен для привязки глобальной логики обработки к определённому префиксу или для безусловного сопоставления. Например, если вы поместите следующее содержимое перед всеми другими определениями маршрутов, оно потребует, чтобы все маршруты начиная с этого места требовали аутентификации и автоматически загружали пользователя. Помните, что эти функции обратного вызова не обязательно являются конечными точками:loadUserПосле выполнения задачи вы можете вызватьnext()метод, чтобы продолжить сопоставление последующих маршрутов.
app.all('*', requireAuthentication, loadUser);Или эта эквивалентная форма:
app.all('*', requireAuthentication);
app.all('*', loadUser);
Другой пример — это глобальный метод белого списка. Этот пример очень похож на предыдущий, за исключением того, что он ограничивает только пути, начинающиеся с/api-префикса.
app.all('/api/*', requireAuthentication);
app.delete(path, callback[, callback ...])
МаршрутизируетHTTP DELETEзапросы к определённым путям с помощью специальных методов обратного вызова. Для получения дополнительной информации см.руководство по маршрутизации.next('router')чтобы обойти оставшиеся callback-функции маршрута. Вы можете использовать этот механизм, чтобы задать предварительные условия для маршрута. Если запрос не может удовлетворить условия обработки текущего маршрута, вы можете передать управление последующим маршрутам.
app.delete('/', function(req, res) {
res.send('DELETE request to homepage');
});
app.disable(name)
Устанавливает логическую настройку с именемnameв значениеfalse, гдеnameДатаблица настроек приложенияявляется одним из свойств в настройках приложения. Вызовapp.set('foo', false)и вызовapp.disable('foo')эквивалентны.
app.disable('trust proxy');
app.get('trust proxy');
// => false
app.disabled(name)
Возвращаетtrueесли логическая настройкаnameотключена (установлена в false)false, гдеnameДатаблица настроек приложенияявляется одним из свойств в настройках приложения.
app.disabled('trust proxy');
// => true
app.enable('trust proxy');
app.disabled('trust proxy');
// => false
app.enable(name)
Устанавливает булеву настройкуnameвtrue, гдеnameДа
app.enable('trust proxy');
app.get('trust proxy');
// => true
app.enabled(name)
Возвращаетtrue, если булева настройкаnameвключена (установлена в true)true, гдеnameДатаблица настроек приложенияявляется одним из свойств в настройках приложения.
app.enabled('trust proxy');
// => false
app.enable('trust proxy');
app.enabled('trust proxy');
// => true
app.engine(ext, callback)
Регистрирует callback указанного движка для рендеринга файлов с расширением ext.require()для загрузки движков на основе расширений файлов. Например, если вы попытаетесь отрендерить файлfoo.jade, Express внутренне вызывает следующее и кэшируетrequire()результат для последующих вызовов, чтобы ускорить производительность.
app.engine('jade', require('jade').__express);
Используйте следующий метод для тех, кто не предоставляет готовый метод.__express, или когда вы хотите использовать другое расширение шаблонизатора..htmlфайл:
app.engine('html', require('ejs').renderFile);В этом примере EJS предоставляет метод.renderFile, который удовлетворяет правилам сигнатуры, заданным Express:(path, options, callback), но помните, что внутренне это простоejs.__expressявляется псевдонимом, поэтому вы можете напрямую использовать расширение.ejs.consolidate.jsЭта библиотека сопоставляет шаблонизаторы следующим образом, чтобы они могли бесшовно работать с Express.
var engines = require('consolidate');
app.engine('haml', engines.haml);
app.engine('html', engines.hogan);
app.get(name)
Возвращает настройку приложения с именемnameзначение настройки приложения, гдеnameДатаблица настроек приложенияявляется одним из свойств в настройках приложения.
app.get('title');
// => undefined
app.set('title', 'My Site');
app.get('title');
// => 'My Site'
app.get(path, callback [, callback ...])
МаршрутизируетHTTP GETзапросы к определённым путям с помощью специальных callback-функций. Для получения дополнительной информации см.руководство по маршрутизации.next('router')чтобы пропустить оставшиеся callback-функции маршрута. Вы можете использовать этот механизм, чтобы задать предварительные условия для маршрута. Если запрос не удовлетворяет условиям обработки текущего маршрута, передайте управление последующим маршрутам.
app.get('/', function(req, res) {
res.send('GET request to homepage');
});
app.listen(port, [hostname], [backlog], [callback])
Привязывает приложение к прослушиванию указанных хоста и порта. Этот метод иNodeвhttp.Server.listen()— одно и то же.
var express = require('express');
var app = express();
app.listen(3000);
При вызовеexpress()возвращаемыйappфактически является JavaScriptFunction, предназначенный для передачи в качестве callback-функции вHTTP-серверы Nodeдля обработки запросов. Таким образом, он может легко предоставлять версии HTTP и HTTPS на основе одного и того же кода, поэтому приложение не является их наследником (это просто простая callback-функция).
var express = require('express');
var https = require('https');
var http = require('http');
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
Метод app.listen() — это удобный метод, как показано ниже (только для протокола HTTP):
app.listen = function() {
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
app.METHOD(path, callback [, callback ...])
Маршрутизирует HTTP-запрос,METHOD— это HTTP-метод запроса, напримерGET,PUT,POSTи т. д. Обратите внимание, что они пишутся строчными буквами. Итак, фактические методы — этоapp.get(),app.post(),app.put()и т. д. Ниже представлена полная таблица методов.
Для получения дополнительной информации см.руководство по маршрутизации.
|
|
|
Если использование вышеуказанных методов приводит к недопустимым именам переменных JavaScript, можно использовать запись в квадратных скобках, например,app['m-search']('/', function ...
Можно предоставить несколько callback-функций, которые ведут себя как промежуточное ПО, за исключением того, что эти callback-функции могут, вызвавnext('router'), обойти оставшиеся callback-функции маршрута. Этот механизм можно использовать для задания предусловий маршрута. Если запрос не удовлетворяет условиям обработки текущего маршрута, передайте управление последующим маршрутам.
В этой документации API обычно используемые HTTP-методыapp.get(),app.post,app.put(),app.delete()описаны как отдельные элементы. Однако остальные перечисленные выше методы работают точно так же.
app.all()— это специальный метод маршрутизации, который не является одним из методов, определённых в протоколе HTTP. Он загружает промежуточное ПО для пути, и он действителен для всех методов запроса.
app.all('/secret', function (req, res) {
console.log('Accessing the secret section...');
next(); // pass control to the next handler
});
app.param([name], callback)
Добавляет callback-триггеры к параметрам маршрута, гдеname— это имя параметра или массив имён параметров,function— метод обратного вызова. Параметры метода обратного вызова, по порядку, — этообъект запроса,объект ответа,следующее промежуточное ПО,значение параметраиимя параметра.nameЕсли это массив, callback-триггеры регистрируются в порядке объявления каждого параметра в массиве. Кроме того, для параметров, кроме последнего, вызов next() в их callback-функцияхnext()для вызова callback-функции следующего объявленного параметра. Для последнего параметра вызовите его в callback-функции.next()вызовет следующее промежуточное ПО в текущем обрабатываемом маршруте, еслиname— это простоstring, тогда это то же самое, что и оно (то есть, если есть только один параметр, то это последний параметр, как последний параметр в массиве). Например, когда:userпоявляется в пути маршрута, вы можете сопоставить логическую обработку загрузки пользователя, чтобы автоматически предоставлятьreq.userэтому маршруту, или проверять входные параметры.
app.param('user', function(req, res, next, id) {
User.find(id, function(error, user) {
if (err) {
next(err);
}
else if (user){
req.user = user;
} else {
next(new Error('failed to load user'));
}
});
});
ДляParamмаршрутов, определённых callback-функциями, они локальны. Они не наследуются смонтированными приложениями или маршрутами. Поэтому определённые вappвParamобратные вызовы вступают в силу только тогда, когдаappмаршрут ... имеет этот параметр маршрута, тогда они вступают в силу.
При определенииparamв маршрутахparamобратные вызовы вызываются первыми; они вызываются один и только один раз в цикле запрос-ответ, даже если совпадает несколько маршрутов, как в следующем примере:
app.param('id', function(req, res, next, id) {
console.log('CALLED ONLY ONCE');
next();
});
app.get('/user/:id', function(req, res, next) {
console.log('although this matches');
next();
});
app.get('/user/:id', function(req, res) {
console.log('and this mathces too');
res.end();
});
При GET /user/42 получается следующий результат:
CALLED ONLY ONCE although this matches and this matches too
app.param(['id', 'page'], function(req, res, next, value) {
console.log('CALLED ONLY ONCE with', value);
next();
});
app.get('/user/:id/:page', function(req. res, next) {
console.log('although this matches');
next();
});
app.get('/user/:id/:page', function (req, res, next) {
console.log('and this matches too');
res.end();
});
При выполнении GET /user/42/3 результат следующий:
CALLED ONLY ONCE with 42 CALLED ONLY ONCE with 3 although this matches and this mathes too
описанный в следующем разделеapp.param(callback)устарел начиная с v4.11.0.
Передав только один аргумент-обратный вызов вapp.param(name, callback)метод,app.param(naem, callback)поведение метода будет полностью изменено. Этот аргумент-обратный вызов — пользовательский метод, касающийсяapp.param(name, callback)какое поведение он должен иметь. Этот метод должен принимать два параметра и возвращать промежуточное ПО. Первый параметр этого обратного вызова — имя URL-параметра для захвата, а второй параметр может быть любым объектом JavaScript, который может использоваться при реализации возвращаемого промежуточного ПО. Промежуточное ПО, возвращаемое этим обратным вызовом, определяет поведение, которое нужно предпринять, когда URL содержит этот параметр. В следующем примере,app.param(name, callback)сигнатура параметра была изменена наapp.param(name, accessId). Вместо приёма имени параметра и обратного вызова,app.param()теперь принимает имя параметра и число.
var express = require('express');
var app = express();
app.param(function(param, option){
return function(req, res, next, val) {
if (val == option) {
next();
}
else {
res.sendStatus(403);
}
}
});
app.param('id', 1337);
app.get('/user/:id', function(req, res) {
res.send('Ok');
});
app.listen(3000, function() {
console.log('Ready');
});
В этом примере сигнатура параметров app.param(name, callback) остаётся такой же, как раньше, но она заменяется промежуточным ПО, которое определяет пользовательский метод проверки типа данных для проверки правильности типа идентификатора пользователя.
app.param(function(param, validator) {
return function(req, res, next, val) {
if (validator(val)) {
next();
}
else {
res.sendStatus(403);
}
}
});
app.param('id', function(candidate) {
return !isNaN(parseFloat(candidate)) && isFinite(candidate);
});
При использовании регулярных выражений не используйте.. Например, нельзя использовать/user-.+/для захватаuser-gami, вместо этого используйте[\\s\\S]или[\\w\\>W]заменить (так же как/user-[\\s\\S]+/).
//captures '1-a_6' but not '543-azser-sder' router.get('/[0-9]+-[[\\w]]*', function); //captures '1-a_6' and '543-az(ser"-sder' but not '5-a s' router.get('/[0-9]+-[[\\S]]*', function); //captures all (equivalent to '.*') router.get('[[\\s\\S]]*', function);
app.path()
С помощью этого метода можно получитьappканонический путь, который являетсястрокой。
var app = express()
, blog = express()
, blogAdmin = express();
app.use('/blog', blog);
app.use('/admin', blogAdmin);
console.log(app.path()); // ''
console.log(blog.path()); // '/blog'
console.log(blogAdmin.path()); // '/blog/admin'
Если приложение смонтировано сложным образом, то и поведение этого метода будет сложным: лучший способ — использовать req.baseUrl для получения канонического пути приложения.
app.post(path, callback, [callback ...])
Маршрутизирует HTTP POST-запросы по специальному пути с использованием специальных callback-функций. Дополнительную информацию см. в [руководстве по маршрутизации](http://expressjs.com/guide/routing.html).
Можно предоставить несколько callback-функций, которые ведут себя как middleware, за исключением того, что эти callback-функции могут обходить оставшиеся callback-функции маршрута, вызывая next('router'). Этот механизм можно использовать для задания некоторых предварительных условий для маршрута; если запрос не удовлетворяет условиям обработки текущего маршрута, передайте управление последующим маршрутам.
app.post('/', function(req, res) {
res.send('POST request to homepage')
});
app.put(path, callback, [callback ...])
МаршрутизируетHTTP PUTзапросы по специальному пути с использованием специальных callback-функций. Дополнительную информацию см. вруководстве по маршрутизации。
Можно предоставить несколько callback-функций, которые ведут себя как middleware, за исключением того, что эти callback-функции могут, вызвавnext('router')обойти оставшиеся callback-функции маршрута. Этот механизм можно использовать для задания некоторых предварительных условий для маршрута; если запрос не удовлетворяет условиям обработки текущего маршрута, передайте управление последующим маршрутам.
app.put('/', function(req, res) {
res.send('PUT request to homepage');
});
app.render(view, [locals], callback)
С помощьюcallbackcallback возвращаетviewHTML-текст, полученный после рендеринга. Он может принимать необязательный параметр, содержащийviewнеобходимые локальные данные. Этот метод похож наres.render(),за исключением того, что он не может отправить отрендеренный HTML-текст клиенту。
будетapp.render()Рассматривайте его как служебный метод, который может генерировать строки отрендеренного представления. Вres.render()внутри него используетсяapp.render()для рендеринга представлений.
Если кэширование представлений включено, кэш локальных переменных будет сохранён. Если вы хотите кэшировать представления во время разработки, установите для него значениеtrue. В рабочей среде кэширование представлений включено по умолчанию.
app.render('email', function(err, html) {
// ...
});
app.render('email', {name:'Tobi'}, function(err, html) {
// ...
});
app.route(path)
Возвращает singleton-экземпляр маршрута, к которому затем можно применять middleware для различных HTTP-действий. Используйтеapp.route(), чтобы избежать дублирования имён маршрутов (например, из-за опечаток) -- смысл в том, что следует использоватьapp.router()этот singleton-метод, чтобы избежать создания нескольких экземпляров маршрута для одного и того же пути.
var app = express();
app.route('/events')
.all(function(req, res, next) {
// runs for all HTTP verbs first
// think of it as route specific middleware!
})
.get(function(req, res, next) {
res.json(...);
})
.post(function(req, res, next) {
// maybe add a new event...
})
app.set(name, value)
Присваивает значение настройке name, где name — это одно из свойств в разделеНастройки приложения. Для логического свойства вызов app.set('foo', ture) эквивалентен вызову app.enable('foo'). Аналогично вызов app.set('foo', false) эквивалентен вызову app.disable('foo').
Вы можете использовать app.get() для получения установленного значения:
app.set('title', 'My Site');
app.get('title'); // 'My Site'
Настройки приложения
Еслиnameявляется одной из настроек приложения, это повлияет на поведение приложения. Настройки приложения перечислены ниже.
| Свойство | Type | Значение | Default |
|---|---|---|---|
| case sensitive routing | Boolean | Включает чувствительность к регистру. | Не включено. Для/Fooи/fooобработка одинакова. |
| env | String | Режим окружения. | process.env.NODEENV (переменная окружения NODEENV) или 'development' |
| etag | Варьируется | ЗадаётETag-заголовок ответа. Возможные значения см. втаблице параметров etag. Подробнее озаголовке HTTP ETag。 | слабый |
| имя callback-функции jsonp | String | Задаёт имя callback-функции JSONP по умолчанию. | ?callback= |
| функция замены json | String | callback-функция JSONP | null |
| отступы json | Number | Если это значение задано, отправляются JSON-строки, отформатированные с отступами. | Disabled |
| парсер query | Варьируется | Установите значение вfalse, чтобы отключитьquery parser, или установитеsimple,extended, или вы можете реализовать свою собственнуюфункцию парсингастроки запроса.simpleОсновано наNodeвстроенныйпарсингзапросов,querystring。 | "extend" |
| strict routing | Boolean | Включите strict routing. | Не включено. Для/fooи/foo/обработка маршрутов одинакова. |
| subdomain offset | Number | Количество разделённых точками частей хоста, которое нужно удалить для доступа к субдоменам | 2 |
| trust proxy | Варьируется | Указывает, чтоappнаходится за обратным прокси; используйтеx-Forwarded-*для определения соединения и IP-адреса клиента. Примечание:X-Forwarded-*Заголовок легко подделать, поэтому определение IP-адреса клиента ненадёжно.trust proxyОтключено по умолчанию. При включении Express пытается получить IP-адрес подключённого клиента через внешний прокси или цепочку прокси.req.ipsСвойство содержит массив IP-адресов подключённых клиентов. Чтобы включить его, установите значение, определённое втаблице параметров trust proxy, равнымзначению, определённому ниже.trust proxyРеализация этой настройки используетproxy-addrпакет. Если вы хотите получить больше информации, обратитесь к его документации | Отключить |
| views | Строка или массив | viewкаталог или массив каталогов, где он расположен. Если это массив, поиск будет выполняться в порядке, указанном в массиве.view。 | process.cwd() + '/views' |
| view cache | Boolean | Включить кэш компиляции шаблонов представлений. | Включено по умолчанию в production. |
| view engine | String | Если не указано, для расширения используется движок по умолчанию. | |
| x-powered-by | Boolean | ВключитьX-Powered-By:ExpressHTTP-заголовок | истина |
trust proxyнастройка параметрасм.Express behind proxiesдля получения дополнительной информации.
| Type | Значение |
|---|---|
| Boolean |
Если оно имеет значениеtrue, IP-адрес клиента берется какX-Forwarded-*самая левая запись заголовка. Если оно имеет значениеfalse, можно понять, чтоappнапрямую подключено к Интернету, и IP-адрес клиента получается изreq.connection.remoteAddress。falseявляется настройкой по умолчанию. |
| IP-адреса |
IP-адрес, подсеть или группа IP-адресов, а также делегированные подсети. Ниже приведен список предварительно настроенных имен подсетей.
Используйте любой из следующих методов для установки IP-адреса:
app.set('trust proxy', 'loopback') // specify a single subnet
app.set('trust proxy', 'loopback, 123.123.123.123') // specify a subnet and an address
app.set('trust proxy', 'loopback, linklocal, uniquelocal') // specify multiple subnets as CSV
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']) // specify multiple subnets as an array
Когда указан IP-адрес, этот IP-адрес или подсеть исключается из приложения, в котором установлен этот IP-адрес или подсеть; неделегированный адрес, ближайший к серверу приложений, будет рассматриваться как IP-адрес клиента. |
| Number |
Доверять соединениям с количеством переходов меньше или равным n между обратным прокси и приложением как клиенту. |
| Функция |
Пользовательский делегированный механизм доверия прокси. Если вы используете это, убедитесь, что понимаете, что делаете.
app.set('trust proxy', function (ip) {
if (ip === '127.0.0.1' || ip === '123.123.123.123') return true; // trusted IPs
else return false;
})
|
etagНастройка параметра ETagреализация функции используетetagпакет. Если вам нужна дополнительная информация, обратитесь к его документации.
| Type | Значение |
|---|---|
| Boolean |
Установите вtrue, включает слабый ETag. Это настройка по умолчанию. Установитеfalse, отключает все ETags. |
| String | Если этоstrong, включает строгий ETag. Если этоweak, включаетweak ETag. |
| Функция |
пользовательская реализация метода ETag. Если вы используете это, убедитесь, что понимаете, что делаете.
app.set('etag', function (body, encoding) {
return generateHash(body, encoding); // consider the function is defined
})
|
app.use([path,], function [, function...])
Монтируетmiddlewareметод к пути. Если путь не указан, по умолчанию используется '/'.
Маршрут будет соответствовать любому пути, если после заданного пути маршрута сразу следует '/'. Например:app.use('/appale', ...)будет соответствовать '/apple', '/apple/images', '/apple/images/news' и т. д.
в middlewarereq.originalUrlДаreq.baseUrlиreq.pathКомбинация, как показано в примере ниже.
app.use('/admin', function(req, res, next) { // GET 'http://www.example.com/admin/new' console.log(req.originalUrl); // '/admin/new' console.log(req.baseUrl); // '/admin' console.log(req.path);// '/new' });
После монтирования промежуточного ПО по пути, промежуточное ПО будет выполняться всякий раз, когда префикс запрошенного пути совпадает с путём маршрута. Поскольку путь по умолчанию —/, если промежуточное ПО смонтировано без указания пути, это промежуточное ПО будет выполняться для каждого запроса.
// this middleware will be executed for every request to the app.
app.use(function(req, res, next) {
console.log('Time: %d', Date.now());
next();
});
Методы промежуточного ПО обрабатываются по порядку, поэтому порядок включения промежуточного ПО очень важен.
// this middleware will not allow the request to go beyond it
app.use(function(req, res, next) {
res.send('Hello World');
});
// this middleware will never reach this route
app.use('/', function(req, res) {
res.send('Welcome');
});
Путь может быть строкой, представляющей путь, шаблоном пути, регулярным выражением, соответствующим пути, или массивом из них.
Ниже приведены простые примеры путей.
| Type | Пример |
|---|---|
| Путь |
// will match paths starting with /abcd
app.use('/abcd', function (req, res, next) {
next();
})
|
| Шаблон пути |
// will match paths starting with /abcd and /abd
app.use('/abc?d', function (req, res, next) {
next();
})
// will match paths starting with /abcd, /abbcd, /abbbbbcd and so on
app.use('/ab+cd', function (req, res, next) {
next();
})
// will match paths starting with /abcd, /abxcd, /abFOOcd, /abbArcd and so on
app.use('/ab\*cd', function (req, res, next) {
next();
})
// will match paths starting with /ad and /abcd
app.use('/a(bc)?d', function (req, res, next) {
next();
})
|
| Регулярное выражение |
// will match paths starting with /abc and /xyz
app.use(/\/abc|\/xyz/, function (req, res, next) {
next();
})
|
| Массив |
// will match paths starting with /abcd, /xyza, /lmn, and /pqr
app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
next();
})
|
Метод может быть методом промежуточного ПО, серией методов промежуточного ПО, массивом методов промежуточного ПО или их комбинацией. Поскольку router и app реализуют интерфейс промежуточного ПО, вы можете использовать их как любой другой метод промежуточного ПО.
| Использование | Пример |
|---|---|
| Одно промежуточное ПО | Вы можете локально определить и смонтировать промежуточное ПО.app.use(function (req, res, next) {
next();
})
router — допустимое промежуточное ПО.var router = express.Router();
router.get('/', function (req, res, next) {
next();
})
app.use(router);
Приложение Express — допустимое промежуточное ПО.var subApp = express();
subApp.get('/', function (req, res, next) {
next();
})
app.use(subApp);
|
| Серия промежуточного ПО | Для одного и того же пути монтирования вы можете смонтировать более одного промежуточного ПО.var r1 = express.Router();
r1.get('/', function (req, res, next) {
next();
})
var r2 = express.Router();
r2.get('/', function (req, res, next) {
next();
})
app.use(r1, r2);
|
| Массив | Логично использовать массив для организации набора middleware. Если вы передаёте массив middleware в качестве первого или единственного параметра, то нужно указать путь монтирования.var r1 = express.Router();
r1.get('/', function (req, res, next) {
next();
})
var r2 = express.Router();
r2.get('/', function (req, res, next) {
next();
})
app.use('/', [r1, r2]);
|
| Комбинация | Вы можете комбинировать все следующие методы для монтирования middleware.function mw1(req, res, next) { next(); }
function mw2(req, res, next) { next(); }
var r1 = express.Router();
r1.get('/', function (req, res, next) { next(); });
var r2 = express.Router();
r2.get('/', function (req, res, next) { next(); });
var subApp = express();
subApp.get('/', function (req, res, next) { next(); });
app.use(mw1, [mw2, r1, r2], subApp);
|
Ниже приведены некоторые примеры использования middleware express.static в приложении Express.
Обслуживайте статические ресурсы, расположенные в каталоге public внутри каталога приложения:
// GET /style.css etc app.use(express.static(__dirname + '/public'));
В/staticСмонтируйте middleware по пути, чтобы обеспечить хостинг статических ресурсов, только когда запрос начинается с/staticв качестве префикса.
// GET /static/style.css etc.
app.use('/static', express.static(express.__dirname + '/public'));
Отключите логирование запросов к статическим ресурсам, загрузив middleware logger после настройки middleware static.
app.use(express.static(__dirname + '/public')); app.use(logger());
Обслуживайте статические ресурсы из разных путей, но./publicэтот путь сопоставляется легче, чем другие:
app.use(express.static(__dirname + '/public')); app.use(express.static(__dirname + '/files')); app.use(express.static(__dirname + '/uploads'));
Запрос
reqОбъект представляет HTTP-запрос и имеет свойства, содержащие данные из запроса, такие какстрока запроса,,параметры,,тело,,HTTP-заголовкии т. д. В этом документе по соглашению этот объект всегда называетсяreq(HTTP-ответ называетсяres), но их фактические имена определяются параметрами метода обратного вызова, в котором они используются.
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
На самом деле это можно записать и так:
app.get('/user/:id', function(request, response) {
response.send('user' + request.params.id);
});
Свойства
ВExpress 4В,req.filesПо умолчанию,reqон больше не доступен в объекте.req.filesобъект для получения загруженных файлов, вы можете использоватьmultipart-handling(инструментарий для обработки multipart) middleware, такой какbusboy,multer,formidable,multipraty,connect-multipartyилиpez。
req.app
Это свойство содержитexpressссылку на экземпляр приложения, которую можно использовать в качестве промежуточного ПО.
Если вы следуете этому шаблону, вы создаёте модуль, который экспортирует middleware, и этот middleware только в вашем главном файлеrequire()его, тогда этот middleware может черезreq.appполучить экземпляр Express.
// index.js
app.get("/viewdirectory", require('./mymiddleware.js'));
// mymiddleware.js
module.exports = function(req, res) {
res.send('The views directory is ' + req.app.get('views'));
};
req.baseUrl
URL-путь, на котором смонтирован экземпляр маршрутизатора.
var greet = express.Router();
greet.get('/jp', function(req, res) {
console.log(req.baseUrl); // greet
res.send('Konichiwa!');
});
app.use('/greet', greet);
Даже если вы используете шаблон пути или массив шаблонов путей для загрузки маршрутизатора,baseUrlсвойство возвращает совпавшую строку, а не шаблон маршрута. В следующем примере,greetмаршрутизатор загружается по двум шаблонам путей.
app.use(['/gre+t', 'hel{2}o'], greet); // load the on router on '/gre+t' and '/hel{2}o'
Когда путь запроса —/greet/jp,baseUrlДа/greet, когда путь запроса —/hello/jp,req.baseUrlДа/hello。 req.baseUrlиappу объектаmountpathсвойство аналогично, за исключением того, чтоapp.mountpathвозвращает шаблон соответствия пути.
req.body
Тело запроса содержит пары ключ-значение отправленных данных. По умолчанию оноundefined, когда вы используете, например,body-parserиmulterэтот вид парсингаbodyданных с помощью промежуточного ПО, он заполняется.body-parserпромежуточное ПО для заполненияreq.body。
var app = require('express');
var bodyParser = require('body-parser');
var multer = require('multer');// v1.0.5
var upload = multer(); // for parsing multipart/form-data
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({extended:true})); // for parsing application/x-www-form-urlencoded
app.post('/profile', upload.array(), function(req, res, next) {
console.log(req.body);
res.json(req.body);
});
req.cookies
При использовании промежуточного ПО cookie-parser это свойство представляет собой объект, содержащий куки, отправленные с запросом. Если запрос не содержит куки, его значение — {}.
// Cookie: name=tj req.cookies.name // => "tj"
Для получения дополнительной информации, вопросов или замечаний см.cookie-parser。
req.fresh
Указывает, является ли запрос свежим. Это противоположностьreq.staleявляется противоположным.cache-controlзаголовок запроса не содержитno-cacheдиректива и любое из следующих условий равноtrue, тогда оно равноtrue:
- if-modified-sinceзаголовок запроса указан, иlast-modifiedзаголовок запроса равен или раньше, чемmodifiedзаголовок ответа.
- if-none-matchзаголовок запроса является*。
- if-none-matchзаголовок запроса после разбора на его директивы являетсяetagне равным значению заголовка ответа.
ps: Роль If-None-Match: If-None-Match работает вместе с ETag. Принцип работы заключается в добавлении информации ETag в HTTP-ответ. Когда пользователь снова запрашивает ресурс, информация If-None-Match (значение ETag) будет добавлена в HTTP-запрос. Если сервер проверяет, что ETag ресурса не изменился (ресурс не был обновлён), он вернёт статус 304, чтобы сообщить клиенту использовать локальный файл кеша. В противном случае он вернёт статус 200 с новым ресурсом и Etag. Использование такого механизма улучшит производительность веб-сайта.
req.fresh // => true
req.hostname
содержит значение, полученное изHostHTTP-заголовкаhostname。
Когдаtrust proxyКогда параметр установлен во включенное значение,X-Forwarded-Hostиспользуется заголовок вместоHost. Этот заголовок может быть установлен клиентом или прокси.
// Host: "example.com" req.hostname // => "example.com"
req.ips
Когдаtrust proxyКогда параметр установлен во включенное значение, это свойство содержит массивX-Forwarded-ForIP-адресов, указанных в заголовке запроса. В противном случае оно содержит пустой массив. Этот заголовок может быть установлен клиентом или прокси.
Например, еслиX-Forwarded-ForДаclient,proxy1,proxy2,req.ipsто это["clinet", "proxy1", "proxy2"], гдеproxy2находится дальше всего ниже по потоку.
req.originalUrl
req.urlне является нативнымExpressсвойством; он наследуется изhttp-модуля Node。
Это свойство очень похоже наreq.url; однако оно сохраняет исходный URL запроса, позволяя вам свободно перенаправлятьreq.urlна внутренние маршруты. Например,app.use()примонтированииэта возможность может перенаправлятьreq.urlв точку монтирования.
// GET /search?q=something req.originalUrl // => "/search?q=something"
req.params
Объект, содержащий свойства, которые взаимно однозначно соответствуют именам параметров, указанным в маршруте. Например, если у вас есть маршрут/user/:name, то свойствоnameможно использовать какreq.params.name. Значение по умолчанию для этого объекта —{}。
// GET /user/tj req.params.name // => "tj"
Когда вы используете регулярные выражения для определения правил маршрутизации, комбинации групп захвата обычно используютreq.params[n], гдеn— порядковый номер группы захвата. Это правило применяется к безымянным совпадениям с подстановочными знаками, таким как/file/*маршрут:
// GET /file/javascripts/jquery.js req.params[0] // => "javascripts/jquery.js"
req.path
Содержит часть пути URL запроса.
// example.com/users?sort=desc req.path // => "/users"
При вызове в промежуточном ПО точка монтирования не включается вreq.path. Для получения дополнительной информации обратитесь кapp.use().
req.protocol
Протокол запроса, обычноhttp, а при включённом TLS-шифровании —https。
Когда настройкаtrust proxyустановлена во включённое значение, если заголовокX-Forwarded-Protoсуществует, ему будут доверять и использовать его. Этот заголовок может быть установлен клиентом или прокси.
req.ptotocol // => "http"
req.query
Объект, который для каждого параметрастроки запросав маршруте назначает свойство. Если нетстроки запроса, он является пустым объектом.{}。
// GET /search?q=tobi+ferret req.query.q // => "tobi ferret" // GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse req.query.order // => "desc" req.query.shoe.color // => "blue" req.query.shoe.type // => "converse"
req.route
Текущий сопоставленный маршрут, который является строкой. Например:
app.get('/user/:id?', function userIdHandler(req, res) {
console.log(req.route);
res.send('GET')
})
Вывод предыдущего сегмента:
{ path:"/user/:id?"
stack:
[
{ handle:[Function:userIdHandler],
name:"userIdHandler",
params:undefined,
path:undefined,
keys:[],
regexp:/^\/?$/i,
method:'get'
}
]
methods:{get:true}
}
req.secure
Логическое значение. Если установлено TLS-соединение, то оно равноtrue. Эквивалентно:
'https' == req.protocol;
req.signedCookies
При использованииcookie-parserв качестве промежуточного ПО это свойство содержит подписанное значение, отправленное с помощьюcookiesзапроса, и это свойство получает неподписанное значение, которое можно использовать напрямую. Подписанныеcookiesхранятся в отдельном объекте, чтобы отразить намерение разработчика; иначе к значениюreq.cookieможет быть применена вредоносная атака (очень легко быть обманутым). Помните, подписьcookieне скрывает и не шифрует его; она просто предотвращает подделку (поскольку шифрование, используемое для подписи, является закрытым). Если ни один подписанныйcookieне отправлен, то это свойство по умолчанию равно{}。
// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 req.signedCookies.user // => "tobi"
Для получения дополнительной информации, вопросов или замечаний см.cookie-parser。
req.stale
Указывает, является ли запросstale(устаревшим), что противоположноreq.fresh. Для получения дополнительной информации см.req.fresh。
req.stale // => true
req.subdomains
Массив поддоменов в домене запроса.
// Host: "tobi.ferrets.example.com" req.subdomains // => ["ferrets", "tobi"]
req.xhr
Логическое значение. ЕслиX-Requested-Withимеет значениеXMLHttpRequest, то оно равноtrue, что указывает на то, что запрос был отправлен клиентской библиотекой, такой какjQuery。
req.xhr // => true
Методы
req.accepts(types)
Проверяет, принимается ли указанный тип содержимого, на основе HTTP-заголовка Accept запроса. Этот метод возвращает наилучшее совпадение. Если совпадений нет, он возвращает undefined (в этом случае сервер должен вернуть 406 и "Not Acceptable").
Значение type может быть одной строкой MIME-типа (например, application/json), расширением, таким как json, списком, разделённым запятыми, или массивом. Для списка или массива этот метод возвращает наилучший элемент (если он есть).
// Accept: text/html
req.accepts('html');
// => "html"
// Accept: text/*, application/json
req.accepts('html');
// => "html"
req.accepts('text/html');
// => "text/html"
req.accepts(['json', 'text']);
// => "json"
req.accepts('application/json');
// => "application/json"
// Accept: text/*, application/json
req.accepts('image/png');
req.accepts('png');
// => undefined
// Accept: text/*;q=.5, application/json
req.accepts(['html', 'json']);
// => "json"
Для получения дополнительной информации или если у вас есть вопросы или сомнения, см.accepts。
req.acceptsCharsets(charset[, ...])
Возвращает первую настроенную кодировку в указанном наборе символов на основеAccept-CharsetHTTP-заголовка запроса. Если соответствующая кодировка не найдена, возвращает false. Для получения дополнительной информации или если у вас есть вопросы или сомнения, см.accepts。
req.acceptsEncodings(encoding[, ...])
Возвращает первую принимаемую кодировку из указанного набора кодировок на основеAccept-EncodingHTTP-заголовка запроса. Если в указанном наборе кодировок не найдено подходящей кодировки, возвращает false. Для получения дополнительной информации или если у вас есть вопросы или сомнения, см.accepts。
req.acceptsLanguages(lang [, ...])
Возвращает первый принимаемый язык из указанного набора языков на основеAccept-LanguageHTTP-заголовка запроса. Если в указанном наборе языков не найдено подходящего языка, возвращает false. Для получения дополнительной информации или если у вас есть вопросы или сомнения, см.accepts。
req.get(field)
Возвращает содержимое указанного поля HTTP-заголовка запроса (без учёта регистра).ReferrerиRefererСодержимое поля взаимозаменяемо.
req.get('Content-type');
// => "text/plain"
req.get('content-type');
// => "text/plain"
req.get('Something')
// => undefined
Это псевдоним req.header(field).
req.is(type)
Если поле заголовкаContent-typeвходящего запроса соответствует параметруtype, заданномуMIME-типу, то он возвращаетtrue. В противном случае он возвращаетfalse。
// With Content-Type: text/html; charset=utf-8
req.is('html');
req.is('text/html');
req.is('text/*');
// => true
// When Content-Type is application/json
req.is('json');
req.is('application/json');
req.is('application/*');
// => true
req.is('html');
// => false
Для получения дополнительной информации или если у вас есть вопросы или сомнения, см.type-is。
req.param(naem, [, defaultValue])
Устарело. Используйте, где это уместно,req.params,req.bodyилиreq.query。
Возвращаетимязначение текущего параметра.
// ?name=tobi
req.param('name')
// => "tobi"
// POST name=tobi
req.param('name')
// => "tobi"
// /user/tobi for /user/:name
req.param('name')
// => "tobi"
Поиск выполняется в следующем порядке:
- req.params
- req.body
- req.query
При необходимости можно указатьdefaultValue, чтобы задать значение по умолчанию, если этот параметр не удается найти ни в одном из объектов запроса.
Напрямую черезreq.params,req.body,req.queryполучение его должно быть понятнее — если только вы не уверены во входных данных каждого объекта.Body-parserПромежуточное ПО должно быть загружено, если вы используетеreq.param(). Подробности см. вreq.body。
Response
resобъект представляет, когда поступает HTTP-запрос,ExpressHTTP-ответ, возвращаемый приложением. В этой документации по соглашению этот объект всегда сокращается какres(HTTP-запрос сокращается какreq), но их фактические имена определяются параметрами метода обратного вызова, в котором они используются.
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Например:
app.get('/user/:id', function(request, response) {
response.send('user' + request.params.id);
});
Свойства
res.app
Запись таким способом эквивалентна:
Это свойство содержит ссылку на экземпляр приложения Express, который можно использовать в промежуточном ПО.
res.headersSent
res.app и свойство req.app в объекте запроса совпадают.</p>
app.get('/', function(req, res) {
console.log(res.headersSent); // false
res.send('OK'); // send之后就发送了头部
console.log(res.headersSent); // true
});
res.locals
Логическое свойство, указывающее, были ли уже отправлены HTTP-заголовки этим ответом.app.localsОбъект, содержащий переменные, локальные для ответа на этот запрос, и поэтому его переменные доступны только при отображении представлений в рамках цикла ответа на этот запрос (если представления есть). В остальном он и
совпадают.
app.use(function(req, res, next) {
res.locals.user = req.user;
res.locals.authenticated = !req.user.anonymous;
next();
});
Методы
res.append(field [, value])
Этот параметр очень полезен для раскрытия информации уровня запроса, такой как путь запроса, аутентифицированный пользователь, настройки пользователя и т. д.ExpresxsМетод res.append()
поддерживается только в версиях 4.11.0 и выше.fieldк указанномуvalueполю HTTP-заголовка, добавить указанное значение.valueЕсли этот заголовок не был установлен, то используйтезначениедля создания этого заголовка.
может быть строкой или массивом.res.append()Примечание: После вызоваapp.set()calling
res.append('Lind', ['<http://localhost>', '<http://localhost:3000>']);
res.append('Set-Cookie', 'foo=bar;Path=/;HttpOnly');
res.append('Warning', '199 Miscellaneous warning');
res.attachment([filename])
функция сбросит ранее установленное значение.Content-DispositionУстанавливает для HTTP-ответаfilenameсодержимое заголовка в 'attachment'. Если указаноres.type(), затем черезContent-Typeполучая расширение для установкиContent-Disposition, и установить
res.attachment();
// Content-Disposition: attachment
res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png
res.cookie(name, value [,options])
содержимое в 'filename=parameter'.имяизначениеofcookie,значениеThe
параметр может быть строкой или объектом, преобразованным в строку JSON.
| options — это объект, который может иметь следующие свойства. | Свойство | Type |
|---|---|---|
| domain | String | Описание |
| expires | Date | Устанавливает доменное имя для cookie. По умолчанию используется домен вашего приложения. |
| httpOnly | Boolean | Время истечения срока действия cookie в формате GMT. Если оно не указано или установлено в 0, создаётся новый cookie. |
| maxAge | String | Флаг, означающий, что этот cookie может быть получен только веб-сервером. |
| path | String | — удобная опция для установки времени истечения срока действия; это значение в миллисекундах от текущего момента до момента истечения./。 |
| secure | Boolean | Путь cookie. Значение по умолчанию —HTTPSУказывает, что этот cookie может использоваться только |
| signed | Boolean | протокол. |
Указывает, что этот cookie должен быть подписан.optionsТо, что делает res.cookie(), основано на переданномSet-Cookieпараметре для установкиoptionsзаголовок. Если ни один изRFC6265⟧options не указан, то значение по умолчанию —options are specified, then the default value is
указано в
res.cookie('name', 'tobi', {'domain':'.example.com', 'path':'/admin', 'secure':true});
res.cookie('remenberme', '1', {'expires':new Date(Date.now() + 90000), 'httpOnly':true});
Примеры использования:
res.cookie('rememberme', '1', {'maxAge':90000}, "httpOnly":true);
maxAge — удобная опция для установки времени истечения, вычисляемого в миллисекундах от текущего времени. Следующий пример имеет тот же эффект, что и второй выше.
res.cookie('cart', {'items':[1, 2, 3]});
res.cookie('cart', {'items':[1, 2, 3]}, {'maxAge':90000});
Вы можете передать объект в качестве параметра value. Затем он будет сериализован как строка JSON и проанализирован промежуточным ПО bodyParser().
res.cookie('name', 'tobi', {'signed':true});
res.clearCookie(name [,options])
При использовании промежуточного ПО cookie-parser этот метод также поддерживает подписанные cookie. Просто включите опцию signed со значением true при задании параметров. Тогда res.cookie() будет использовать секрет, переданный в cookieParser(secret), для подписи значения.nameВ соответствии с указаннымиoptionsочищает соответствующий cookie. Подробнее оres.cookie()。
res.cookie('name', 'tobi', {'path':'/admin'});
res.clearCookie('name', {'path':'admin'});
res.download(path, [,filename], [,fn])
объект, см.pathПередаётContent-Dispositionуказанный файл как вложение. Обычно браузер предлагает пользователю скачать. По умолчанию,pathпараметр 'filename=' в заголовке — этоfilename(обычно отображается в диалоговом окне браузера). Указывая
параметр, чтобы переопределить значение по умолчанию.fnКогда возникает ошибка или передача завершена, этот метод вызоветres.sendFile()указанный метод обратного вызова. Этот метод использует
res.download('/report-12345.pdf');
res.download('/report-12345.pdf', 'report.pdf');
res.download('report-12345.pdf', 'report.pdf', function(err) {
// Handle error, but keep in mind the response may be partially-sent
// so check res.headersSent
if (err) {
} else {
// decrement a download credit, etc.
}
});
res.end([data] [, encoding])
для передачи файла.NodeЗавершает процесс ответа. Этот метод фактически происходит изresponse.end() — метода http.ServerResponse。
основной модуль, в частностиres.send()иres.json()используются для быстрого завершения запроса без каких-либо данных. Если вам нужно отправить данные, вы можете использовать
res.end(); res.status(404).end();
res.format(object)
подобные методы.AcceptВыполняет согласование содержимого на основе указанного в HTTP-заголовке406Accept объекта запроса приемлемого содержимого. Он использует req.accepts() для выбора обработчика, обслуживающего запрос; эти обработчики сортируются по значению качества. Если этот заголовок не указан, по умолчанию вызывается первый метод. Когда совпадения нет, сервер возвращаетпо умолчанию'Not Acceptable', или вызывает
Content-Typeколбэк.res.set()Заголовок ответа устанавливается, когда выбран метод обратного вызова. Однако вы можете изменить его в этом методе с помощью таких методов, какres.type()。
или{"message":"hey"}Следующий пример ответит сAccept, когда у объекта запроса*/*заголовок установлен в 'application/json' или '*/json' (но если он
res.format({
'text/plain':function() {
res.send('hey');
},
'text/html':function() {
res.send('<p>hey</p>');
},
'application/json':function() {
res.send({message:'hey'});
},
'default':function() {
res.status(406).send('Not Acceptable');
}
})
, то ответом будет 'hey').
res.format({
text:function() {
res.send('hey');
},
html:function() {
res.send('<p>hey</p>');
},
json:function() {
res.send({message:'hey'});
}
})
res.get(field)
Помимо нормализованных MIME-типов, вы также можете использовать расширения для сопоставления этих типов, чтобы избежать многословных реализаций:fieldВозвращает
res.get('Content-Type');
// => "text/plain"
res.json([body])
указанный HTTP-заголовок ответа. Сопоставление чувствительно к регистру.res.send()Отправляет JSON-ответ. Этот метод аналогичен передаче объекта или массива в качестве параметра вnull,undefinedметод. Однако вы можете использовать этот метод для преобразования других значений в JSON, таких как
res.json(null);
res.json({user:'tobi'});
res.status(500).json({error:'message'});
res.jsonp([body])
. (Хотя технически это недопустимый JSON).
res.jsonp(null)
// => null
res.jsonp({user:'tobi'})
// => {"user" : "tobi"}
res.status(500).jsonp({error:'message'})
// => {"error" : "message"}
Отправляет JSON-ответ и поддерживает JSONP. Этот метод имеет тот же эффект, что и res.json(), за исключением того, что он поддерживает callback-функции JSONP в своих опциях.имя callback-функции jsonpПо умолчанию метод callback-функции JSONP просто записывается как callback. Его можно
переопределить с помощью настройки.
// ?callback=foo
res.jsonp({user:'tobo'})
// => foo({"user":"tobi"})
app.set('jsonp callback name', 'cb')
// ?cb=foo
res.status(500).jsonp({error:'message'})
// => foo({"error":"message"})
res.links(links)
Ниже приведены несколько примеров использования JSONP-ответов с тем же кодом:links,linksОбъединяет ссылки
res.links({
next:'http://api.example.com/users?page=2',
last:'http://api.example.com/user?page=5'
});
, предоставленные в качестве свойств переданного параметра; объединённое содержимое используется для заполнения HTTP-заголовка Link ответа.
Link:<http://api.example.com/users?page=2>;rel="next", <http://api.example.com/users?page=5>;rel="last"
res.location(path)
Результат:LocationУстанавливаетpathHTTP-заголовок ответа в указанный
res.location('/foo/bar');
res.location('http://example.com');
res.location('back');
Когдаpathпараметр.backКогда параметр равенReferer, оно имеет особое значение; оно задаёт URL как принадлежащий объекту запроса
URL, указанный в заголовке. Если он не указан в запросе, то это '/'.LocationExpress передаёт указанную строку URL в качестве ответа браузеру вbackзначении заголовка ответа, без обнаружения или изменения, за исключениемlocation: этот параметр. Браузер перенаправит пользователя наReferer: URL-адрес, заданный, илиback: URL-адрес (
res.redirect([status,] path)
случай параметра).pathПеренаправляет на URL, полученный из указанногокод состояния HTTPstatusURL, и указанныйstatus. Если вы не указываете
res.redirect('/foo/bar');
res.redirect('http://example.com');
res.redirect(301, 'http://example.com');
res.redirect('../login');
, код состояния по умолчанию — '302 Found'.
res.redirect('http://google.com');</p><p>
重定向也可以相对于主机的根路径。比如,如果程序的路径为<strong>http://example.com/admin/post/new</strong>,那么下面将重定向到<strong>http://example.com/admim</strong>:</p>
<pre>res.redirect('/admin');Перенаправление также может быть полным URL, чтобы перенаправить на другой сайт.http://example.com/blog/admin/Перенаправление также может быть относительным к текущему URL. Например, из/(обратите внимание на завершающий /http://example.com/blog/admin/post/new。
res.redirect('post/new');), следующее перенаправит наhttp://example.com/blog/admin(без завершающего/), redirectpost/new, перенаправит наhttp://example.com/blog/post/new. Если вышесказанное кажется запутанным, вы можете рассматривать сегменты пути как каталоги (с '/') или файлы, это нормально. Относительные перенаправления пути также разрешены. Если ваш текущий путь —http://example.com/admin/post/new, следующая операция перенаправит наhttp://example.com/admin/post:
res.redirect('..');backПеренаправляет запрос наreferer, когда не предоставленreferer, по умолчанию используется/。
res.redirect('back');
res.render(view [, locals] [, callback])
Отрисовывает представление и затем отправляет отрисованный HTML-документ клиенту. Необязательные параметры:
- locals, объект, определяющий локальные свойства представления.
- callback— функция обратного вызова. Если этот параметр указан,renderметод вернёт ошибку и отрендеренный шаблон и не будет автоматически отправлять ответ. При возникновении ошибки вы можете вызватьnext(err)метод внутри этого callback.
Кэширование локальных переменных включает кэширование представлений. Чтобы кэшировать представления в среде разработки, необходимо вручную установить значение true; в производственной среде кэширование представлений включено по умолчанию.
// send the rendered view to the client
res.render('index');
// if a callback is specified, the render HTML string has to be sent explicitly
res.render('index', function(err, html) {
res.send(html);
});
// pass a local variable to the view
res.render('user', {name:'Tobi'}, function(err, html) {
// ...
});
res.send([body])
Отправляет HTTP-ответ.
bodyПараметр может быть объектомBuffer, строкой, объектом или массивом. Например:
res.send(new Buffer('whoop'));
res.send({some:'json'});
res.send('<p>some html</p>');
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });
Для обычных непоточных запросов этот метод может выполнять множество полезных задач: например, он автоматически назначает HTTP-заголовок ответа Content-Length (если он не был определён ранее), а также поддерживает автоматические обновления HEAD и HTTP-кэша.
Если параметр является объектом Buffer, этот метод устанавливает HTTP-заголовок ответа Content-Type в application/octet-stream, если он не указан заранее, как показано ниже:
res.set('Content-Type', 'text/html');
res.send(new Buffer('<p>some html</p>'));
Если параметр является строкой, этот метод устанавливает HTTP-заголовок ответа Content-Type в text/html:
res.send('<p>some html</p>');
Если параметр является объектом или массивом, Express представляет его в формате JSON:
res.send({user:'tobi'});
res.send([1, 2, 3]);
res.sendFile(path [, options] [, fn])
res.sendFile()изExpress v4.8.0Поддержка началась.
Передать указанный файл по путиpath. УстановитьContent-TypeHTTP-заголовок на основе расширения файла. Если вoptionsесть настройка относительноroot,pathдолжен быть абсолютным путём к файлу.optionsподробности параметра:
| Свойство | Описание | Значение по умолчанию | Доступные версии |
|---|---|---|---|
| maxAge | УстановитеCache-Controlдляmax-ageсвойства, в миллисекундах, или строку в форматеmsformat | 0 | |
| root | Корневой каталог относительно имени файла | ||
| lastModified | УстановитеLast-Modifiedзаголовок в значение времени последнего изменения этого файла в системе. Установитеfalse, чтобы отключить его. | Включить | 4.9.0+ |
| headers | Объект, содержащий HTTP-заголовки, связанные с файлом. | ||
| dotfiles | Опция, указывающая, поддерживать ли dotfiles. Возможные значения: "allow", "deny", "ignore" | "ignore" |
Когда передача завершена или возникает ошибка, этот метод вызываетfnметод обратного вызова. Если этот параметр обратного вызова указан и возникает ошибка, метод обратного вызова должен явно обработать процесс ответа, завершив цикл запрос-ответ или передав управление следующему маршруту.
Ниже приведён пример использования всех параметров сres.sendFile():
app.get('/file/:name', function(req, res, next) {
var options = {
root:__dirname + '/public',
dotfile:'deny',
headers:{
'x-timestamp':Date.now(),
'x-sent':true
}
};
var fileName = req.params.name;
res.sendFile(fileName, options, function(err) {
if (err) {
console.log(err);
res.status(err.status).end();
}
else {
console.log('sent', fileName);
}
});
});
res.sendFile обеспечивает детализированную поддержку обслуживания файлов, как показано в следующем примере:
app.get('/user/:uid/photos/:file', function(req, res) {
var uid = req.params.uid
, file = req.params.file;
req.user.mayViewFilesFrom(uid, function(yes) {
if (yes) {
res.sendFile('/upload/' + uid + '/' + file);
}
else {
res.status(403).send('Sorry! you cant see that.');
}
});
})
Для получения дополнительной информации или если у вас есть вопросы или сомнения, обратитесь кsend。
res.sendStatus(statusCode)
Устанавливает у объекта ответакод состояния HTTPравнымstatusCodeи отправляетstatusCodeсоответствующее строковое представление в качестве тела ответа.
res.sendStatus(200); // equivalent to res.status(200).send('OK');
res.sendStatus(403); // equivalent to res.status(403).send('Forbidden');
res.sendStatus(404); // equivalent to res.status(404).send('Not Found');
res.sendStatus(500); // equivalent to res.status(500).send('Internal Server Error')
Если указан неподдерживаемый статус, HTTP-статус всё равно устанавливается вstatusCode, а строка этого кода используется в качестве тела.
res.sendStatus(2000); // equivalent to res.status(2000).send('2000');Подробнее о кодах состояния HTTP
res.set(field [, value])
Устанавливает HTTP-заголовок объекта ответаfieldвvalue. Чтобы установить несколько значений сразу, можно передать объект в качестве параметра.
res.set('Content-Type', 'text/plain');
res.set({
'Content-Type':'text/plain',
'Content-Length':'123',
'ETag':'123456'
})
Это имеет тот же эффект, что и res.header(field [,value]).
res.status(code)
Используйте этот метод, чтобы установить HTTP-статус объекта ответа. Это цепной псевдоним Noderesponse.statusCode.
res.status(403).end();
res.status(400).send('Bad Request');
res.status(404).sendFile('/absolute/path/to/404.png');
res.type(type)
Приложение установитContent-TypeMIME-тип HTTP-заголовка, если этот заданныйtypeможет бытьmime.lookupразобран в правильныйContent-Type. Еслиtypeсодержит/символы, приложение напрямую установитContent-Type— этотип。
res.type('.html'); // => 'text/html'
res.type('html'); // => 'text/html'
res.type('json'); // => 'application/json'
res.type('application/json'); // => 'application/json'
res.type('png'); // => image/png:
res.vary(field)
Добавляет заголовок ответа Vary, когда нет заголовка ответа Vary.
Примечание: смысл Vary — сообщить прокси-серверам/кэшам/CDN, как определять, одинаковы ли запросы. Комбинации в Vary — это основа, по которой серверы/кэши/CDN определяют это. Например, если Vary содержит User-Agent, то даже для одного и того же запроса, если пользователь открывает страницу в IE, а затем снова открывает её в Firefox, CDN/прокси будет считать их разными страницами. Если Vary не содержит User-Agent, CDN/прокси будет считать их одной и той же страницей и сразу вернёт пользователю кэшированную страницу, не запрашивая страницу у веб-сервера снова. Проще говоря, это эквивалентноfield, используя его как ключ кэша, чтобы определить, произошло ли попадание в кэш.
res.vary('User-Agent').render('docs');
Router
Arouter— это отдельный экземпляр middleware и маршрутизации. Его можно рассматривать как «мини-приложение», которое умеет работать с middleware и методами маршрутизации. У каждого приложенияExpressесть встроенный маршрутизатор приложения.app.use()в качестве параметра метода или как параметрuse()другого маршрута.expressобъект имеетRouter()метод, и вы можете использоватьRouter(), чтобы создать новыйrouterобъект.
res.vary('User-Agent').render('docs');
Router([options])
Следующим образом можно создать маршрут:
var router = express.Router([options]);
optionsПараметр может задавать поведение маршрута, со следующими опциями:
| Свойство | Описание | Значение по умолчанию | Доступность |
|---|---|---|---|
| caseSensitive | Учитывать ли регистр | По умолчанию не включено. Обрабатывать/Fooи/fooодинаково. | |
| mergeParams | Сохранятьres.paramsродительского маршрута. Если параметры родительского маршрута конфликтуют с параметрами дочернего маршрута, параметры дочернего маршрута имеют приоритет. | false | 4.5.0+ |
| strict | Включает строгую маршрутизацию. | По умолчанию не включено,/fooи/foo/обрабатываются маршрутизацией одинаково. |
Вы можете рассматриватьrouterкак приложение, к которому можно добавлять промежуточное ПО и методы HTTP-маршрутизации (такие какget,put,postи т.д.).
// invoked for any requests passed to this router
router.use(function(req, res, next) {
// .. some logic here .. like any other middleware
next();
});
// will handle any request that ends in /events
// depends on where the router is "use()'d"
router.get('/events', function(req, res, next) {
// ..
});
Вы можете подключить router к определённому корневому URL, чтобы вы могли размещать различные маршруты в разных файлах или даже в мини-программах.
// only requests to /calendar/* will be sent to our "router"
app.use('/calendar', router);
Методы
router.all(path, [callback, ...] callback)
Этот метод совпадает с методомrouter.METHOD(), за исключением того, что этот метод соответствует всем HTTP-действиям.
Этот метод очень полезен для сопоставления глобальной логики с определённым префиксом пути или произвольным сопоставлением. Например, если вы разместите показанный ниже маршрут перед другими маршрутами, он потребует, чтобы все маршруты с этого момента выполняли операции проверки и автоматически загружали информацию о пользователе. Помните, эти операции глобальной логики не обязаны завершать цикл запрос-ответ:loaduserВы можете выполнить задачу, а затем вызватьnext(), чтобы передать поток выполнения последующим маршрутам.
router.all('*', requireAuthentication, loadUser);Эквивалентная форма:
router.all('*', requireAuthentication)
router.all('*', loadUser);
Это пример глобальной функции белого списка. Этот пример похож на предыдущий, но он применяется только к путям, начинающимся с/api:
router.all('/api/*', requireAuthentication);
router.METHOD(path, [callback, ...] callback)
router.METHOD()Метод предоставляет методы маршрутизации вExpress, гдеMETHOD— один из HTTP-методов, таких какGET,PUT,POSTи т. д., ноrouterMETHOD в нижнем регистре. Поэтому фактическими методами являютсяrouter.get(),router.put(),router.post()и т. д.
Вы можете предоставить несколько функций обратного вызова, которые ведут себя как middleware, за исключением того, что эти обратные вызовы могут вызыватьnext('router'), чтобы обойти оставшиеся обратные вызовы маршрута. Вы можете использовать этот механизм для установки предварительных условий для маршрута. Если запрос не удовлетворяет условиям обработки текущего маршрута, передайте управление последующим маршрутам.
Следующий фрагмент может проиллюстрировать простейшее определение маршрута. Express преобразует строку пути в регулярное выражение для внутреннего сопоставления входящих запросов. При сопоставлении он не учитываетстроки запроса, например, "GET /" будет соответствовать следующему маршруту, и "GET /?name=tobi" тоже.
router.get('/', function(req, res) {
res.send('Hello World');
});
Если у вас есть особые ограничения на путь для сопоставления, вы можете использовать регулярные выражения. Например, следующее может соответствовать "GET /commits/71dbb9c" и "GET /commits/71bb92..4c084f9".
router.get(/^\/commits\/(\w+)(?:\.\.(\w+))?$/, function(req, res) {
var from = req.params[0];
var to = req.params[1];
res.send('commit range ' + from + '..' + to);
});
router.param(name, callback)
Добавляет триггеры обратного вызова к параметрам маршрута, гдеname— имя параметра,function— метод обратного вызова. Параметры метода обратного вызова, по порядку, — это объект запроса, объект ответа, следующее middleware, значение параметра и имя параметра. Хотяnameтехнически необязателен, его не рекомендуется использовать после Express V4.11.0 (см. ниже).
В отличие отapp.param(),router.param()не принимает массив в качестве параметров маршрута.
Например, когда:userпоявляется в пути маршрута, вы можете сопоставить логику загрузки пользователя, чтобы автоматически предоставлятьreq.userэтому маршруту, или проверять входные параметры.
router.param('user', function(req, res, next, id) {
User.find(id, function(error, user) {
if (err) {
next(err);
}
else if (user){
req.user = user;
} else {
next(new Error('failed to load user'));
}
});
});
ДляParamмаршрутов, определённых с помощью callback, они локальны. Они не наследуются смонтированным приложением или маршрутизатором. Поэтому определённые наrouterэтиparamколбэки только если наrouterвступают в силу только когда маршрут на нём имеет этот параметр маршрута.
При определенииparamна маршруте,paramколбэки вызываются первыми, и они будут вызваны один и только один раз в цикле запрос-ответ, даже если совпадает несколько маршрутов, как в следующем примере:
router.param('id', function(req, res, next, id) {
console.log('CALLED ONLY ONCE');
next();
});
router.get('/user/:id', function(req, res, next) {
console.log('although this matches');
next();
});
router.get('/user/:id', function(req, res) {
console.log('and this mathces too');
res.end();
});
Когда запрашивается GET /user/42, получается следующий результат:
CALLED ONLY ONCE although this matches and this matches too
Описанный в следующем разделеrouter.param(callback)устарел начиная с v4.11.0.
Передав только один параметр callback вrouter.param(name, callback)метод,router.param(naem, callback)поведение метода полностью изменится. Этот параметр callback — это пользовательский метод, который определяетrouter.param(name, callback)какое поведение он должен иметь. Этот метод должен принимать два параметра и возвращать middleware.
Первый параметр этого callback — имя URL-параметра для захвата, а второй параметр может быть любым объектом JavaScript, который может использоваться при реализации возвращаемого middleware. Middleware, возвращаемый этим методом callback, определяет поведение, которое нужно предпринять, когда URL содержит этот параметр.
В следующем примереrouter.param(name, callback)сигнатура параметра была изменена наrouter.param(name, accessId). Замена принимает имя параметра и callback,router.param()и теперь принимает имя параметра и число.
var express = require('express');
var app = express();
var router = express.Router();
router.param(function(param, option){
return function(req, res, next, val) {
if (val == option) {
next();
}
else {
res.sendStatus(403);
}
}
});
router.param('id', 1337);
router.get('/user/:id', function(req, res) {
res.send('Ok');
});
app.use(router);
app.listen(3000, function() {
console.log('Ready');
});
В этом примере сигнатура параметров router.param(name. callback) остаётся такой же, как и раньше, но она заменяется промежуточным ПО, которое определяет пользовательский метод определения типа данных для проверки корректности типа идентификатора пользователя.
router.param(function(param, validator) {
return function(req, res, next, val) {
if (validator(val)) {
next();
}
else {
res.sendStatus(403);
}
}
});
router.param('id', function(candidate) {
return !isNaN(parseFloat(candidate)) && isFinite(candidate);
});
router.route(path)
Возвращает экземпляр маршрута-синглтона, к которому затем можно применить промежуточное ПО для различных HTTP-действий. Используйтеrouter.route(), чтобы избежать дублирования имён маршрутов (например, ошибок из-за опечаток) -- смысл в том, чтобы использоватьrouter.route()этот синглтон-метод, чтобы избежать нескольких экземпляров маршрута для одного и того же пути.
На основе примера сrouter.param()выше следующий код показывает, как использоватьrouter.route()для указания обработчиков для различных HTTP-методов.
var router = express.Router();
router.param('user_id', function(req, res, next, id) {
// sample user, would actually fetch from DB, etc...
req.user = {
id:id,
name:"TJ"
};
next();
});
router.route('/users/:user_id')
.all(function(req, res, next) {
// runs for all HTTP verbs first
// think of it as route specific middleware!
next();
})
.get(function(req, res, next) {
res.json(req.user);
})
.put(function(req, res, next) {
// just an example of maybe updating the user
req.user.name = req.params.name;
// save user ... etc
res.json(req.user);
})
.post(function(req, res, next) {
next(new Error('not implemented'));
})
.delete(function(req, res, next) {
next(new Error('not implemented'));
})
Этот метод повторно использует один путь /usrs/:userid для добавления различных HTTP-методов.
router.use([path], [function, ...] function)
Для необязательного параметраpathсмонтируйте заданный метод промежуточного ПО по указанному пути. Если параметрpathне указан, значением по умолчанию является/.app.use(). Этот метод аналогиченapp.use()для получения дополнительной информации.
Промежуточное ПО похоже на водопроводную трубу. Запрос начинается с первого промежуточного ПО, которое вы определяете, и проходит вниз по стеку промежуточного ПО, обрабатывая запрос, если путь совпадает.
var express = require('express');
var app = express();
var router = express.Router();
// simple logger for this router`s requests
// all requests to this router will first hit this middleware
router.use(function(req, res, next) {
console.log('%s %s %s', req.method, req.url, req.path);
next();
})
// this will only be invoked if the path starts with /bar form the mount ponit
router.use('/bar', function(req, res, next) {
// ... maybe some additional /bar logging ...
next();
})
// always be invoked
router.use(function(req, res, next) {
res.send('hello world');
})
app.use('/foo', router);
app.listen(3000);
Для функций промежуточного ПО смонтированный путь отбрасывается и становится невидимым. Основное влияние этой особенности в том, что для разных путей монтирование одного и того же промежуточного ПО может не требовать изменений кода, даже если его префикс изменился.
Порядок, в котором вы определяете промежуточное ПО с помощью router.use(), важен. Промежуточное ПО вызывается по порядку, поэтому порядок определяет приоритет промежуточного ПО. Например, логирование обычно является первым промежуточным ПО, которое вы используете, чтобы каждый запрос записывался.
var logger = require('morgan');
router.use(logger());
router.use(express.static(__dirname + '/public'));
router.use(function(req, res) {
res.send('Hello');
});
Теперь, чтобы поддержать то, что вы не хотите логировать запросы к статическим файлам, но хотите продолжать логировать те маршруты и промежуточное ПО, которые определены послеlogger(). Вы можете просто переместитьstatic()в начало, чтобы решить это:
router.use(express.static(__dirname + '/public'));
router.use(logger());
router.use(function(req, res){
res.send('Hello');
});
Ещё один конкретный пример — размещение статических файлов из разных путей. Можно поставить./publicв начало, чтобы получить более высокий приоритет:
app.use(express.static(__dirname + '/public')); app.use(express.static(__dirname + '/files')); app.use(express.static(__dirname + '/uploads'));
router.use()Метод также поддерживает именованные параметры, так что ваша точка монтирования может использовать именованные параметры для предварительной загрузки относительно других маршрутов, что очень полезно.
Исходный адрес: https://github.com/bajian/express_api_4.x_chinese