Перейти к содержимому

Как установить заголовок ответа в express

  • автор:

Как задать заголовок Content-Length в Express.js

Пытаюсь разобраться с этой документацией. https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests Я бы не хотел лезть в корни node.js т.к. в данный момент специализируюсь на front-end, поэтому использую express.js т.к. он прост в освоении. Хочу по кусочкам отослать на клиент audio/mpeg файл. Как инициирующий реквест с клиента, отдать Content-Length, не отдавая сам файл целиком. Когда просто отправляешь файлы методами res.sendFile res.download То Express.js автоматически выставляет Content-Length. Но мне не нужно отправлять весь файл. Буду рад ответам или ссылкам на полезные статьи (en, ru) на тему частичной передачи данных в node.js / express.js.

Отслеживать
задан 4 апр 2017 в 10:20
111 4 4 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Если вопрос в том, как задать заголовок для ответа, то вот, примерно как то так

response.writeHead(200, < 'Content-Length': N >); // N - длина ответа в байтах 

Если вопрос про то, как отправить часть файла, то тут вам поможет официальная документация по FileSystem от Node JS

Как установить заголовок ответа для ресурсов express.js

Мне нужно установить CORS для включения в скрипты, обслуживаемые Express. Как настроить заголовки в этих возвращенных ответах для public/assets?

Dr.Knowitall 20 май 2014, в 08:39
Поделиться
Поделиться:

7 ответов

Лучший ответ

Существует по крайней мере одно промежуточное программное обеспечение для npm для обработки CORS в Express: cors. [см. ответ @mscdex] Вот как установить настраиваемые заголовки ответов, из ExpressJS DOC

res.set(field, [value]) 

Установить поле заголовка для значения

res.set('Content-Type', 'text/plain'); 

или передать объект для установки сразу нескольких полей.

res.set(< 'Content-Type': 'text/plain', 'Content-Length': '123', 'ETag': '12345' >) 

Псевдоним как

res.header(field, [value]) 

klode 20 май 2014, в 12:35
Поделиться

Как я могу получить эти значения? Потому что я установил эти значения в res объекте. Когда я пытаюсь увидеть этот контент, я вижу неопределенным использование res.headers ;

Bruno Casali 05 май 2016, в 17:33
Тогда я использую res.write(‘content’) ?
George 13 июль 2016, в 20:11
Эта строка должна быть использована перед написанием головы.
Virendra Singh Rathore 09 нояб. 2016, в 16:05

По какой — то причине res.set не работает для меня, но cors промежуточного слоя сделал трюк правильно.

Cezar D. 28 июнь 2017, в 02:31
Показать ещё 2 комментария

Это так раздражает.

Хорошо, если у кого-то все еще есть проблемы или он просто не хочет добавлять другую библиотеку. Все, что вам нужно сделать, это поместить эту промежуточную строку кода перед вашими маршрутами.

app.use((req, res, next) => < res.append('Access-Control-Allow-Origin', ['*']); res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.append('Access-Control-Allow-Headers', 'Content-Type'); next(); >); // Express routes app.get('/api/examples', (req, res)=> ); 

Proximo 30 сен. 2017, в 03:05
Поделиться

Существует по крайней мере одно промежуточное программное обеспечение для npm для обработки CORS в Express: cors.

mscdex 20 май 2014, в 13:57
Поделиться
Это мне очень помогло! Спасибо.
Maas 21 сен. 2015, в 11:09

Вы можете сделать это с помощью Cors. Корс будет обрабатывать ваш ответ CORS

var cors = require('cors') app.use(cors()); 

Rahul Solanki 10 авг. 2016, в 11:22
Поделиться

@klode ответ правильный.

Однако вы должны установить другой заголовок ответа, чтобы сделать ваш заголовок доступным для других.

Во-первых, вы добавляете «размер страницы» в заголовке ответа

response.set('page-size', 20); 

Затем все, что вам нужно сделать, это открыть свой заголовок

response.set('Access-Control-Expose-Headers', 'page-size') 

kpanodrean 10 авг. 2017, в 09:44
Поделиться

Я застрял более часа, пытаясь понять, почему ни один из моих пользовательских заголовков не добирался до другого конца. Разоблачение их было ответом. Спасибо вам большое! Почему этот заголовок не упоминается в документах Express (или в каких-либо статьях о пользовательских заголовках, которые я до сих пор читал) очень озадачивает.

Devin Spikowski 31 янв. 2018, в 12:07

Вы также можете добавить промежуточное ПО для добавления заголовков CORS, что-то вроде этого будет работать:

/** * Adds CORS headers to the response * * * * @param request the Request object * @param response the Response object * @param next function to continue execution * @returns * @example * * const express = require('express'); * const corsHeaders = require('./middleware/cors-headers'); * * const app = express(); * app.use(corsHeaders); * */ module.exports = (request, response, next) => < // http://expressjs.com/en/4x/api.html#res.set response.set(< 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'DELETE,GET,PATCH,POST,PUT', 'Access-Control-Allow-Headers': 'Content-Type,Authorization' >); // intercept OPTIONS method if(request.method === 'OPTIONS') < response.send(200); >else < next(); >>; 

Объект ответа¶

Объект ответа в Node.js Express используется для отправки сообщения о результатах обработки поступившего запроса и сопутствующих результату данных, если таковые имеются.

Свойства объекта запроса Node.js:

headersSent — булевое значение, true , если заголовки ответа уже были отправлены;

1 2 3 4 5 6
app.get('/', (req, res) =>  console.log(res.headersSent); //false res.status(200).send( message: 'ok' >); console.log(res.headersSent); //true return; >); 

cookie(key, value) — устанавливает значения куки-файлов;

clearCookie() — очищает куки-файлы;

download(filename) — предлагает в ответ на запрос скачать файл;

1 2 3
app.get('/user-profile', (req, res) =>  return res.status(200).download('profile.png'); >); 

redirect(code?, url) — перенаправляет запрос на заданный URL с 302 статусом по умолчанию, в качестве первого параметра можно указать иной код ответа;

1 2 3
app.get('/', (req, res) =>  return res.redirect(301, '/login'); >); 

render() — используется для генерации представлений используемого шаблонизатора, подробно здесь;

status() — используется для установки кода ответа, но сам ответ не отправляет;

1 2 3 4
app.get('/', (req, res) =>  res.status(200); //устанавливает код ответа 200, ответ не отправлен return res.send( message: 'ok' >); //ответ отправлен >); 

set() — используется для указания заголовков ответа;

1 2 3
app.get('/', (req, res) =>  res.set('Content-Type', 'text/plain'); >); 

type() — задает тип отправляемых вместе с ответом данных;

1 2 3
app.get('/', (req, res) =>  res.type('text/plain'); >); 

send() — отправляет ответ на запрос, в качестве параметра принимает данные для отправки, при этом рекомендуется явно указывать для данных их тип;

1 2 3 4
app.get('/', (req, res) =>  res.type('text/plain'); return res.send('Any data'); >); 

sendStatus() — задает статус и сразу отправляет пустой ответ;

json() — принимает данные в формате JSON и отправляет их в качестве ответа с правильно указанным заголовком Content-Type ;

1 2 3
app.get('/', (req, res) =>  return res.json( message: 'ok' >); >); 

end() — отправляет ответ со всеми указанными до его вызова параметрами, сам не принимает никаких параметров.

1 2 3 4 5
app.get('/', (req, res) =>  res.type('text/plain'); res.status(201); res.end(); >); 

Отправить ответ можно только один раз, повторная отправка приведет к ошибке.

Использование промежуточных обработчиков

Express — это веб-фреймворк маршрутизации и промежуточной обработки с минимальной собственной функциональностью: приложение Express, по сути, представляет собой серию вызовов функций промежуточной обработки.

Функции промежуточной обработки (middleware) — это функции, имеющие доступ к объекту запроса ( req ), объекту ответа ( res ) и к следующей функции промежуточной обработки в цикле “запрос-ответ” приложения. Следующая функция промежуточной обработки, как правило, обозначается переменной next .

Функции промежуточной обработки могут выполнять следующие задачи:

  • Выполнение любого кода.
  • Внесение изменений в объекты запросов и ответов.
  • Завершение цикла “запрос-ответ”.
  • Вызов следующей функции промежуточной обработки из стека.

Если текущая функция промежуточной обработки не завершает цикл “запрос-ответ”, она должна вызвать next() для передачи управления следующей функции промежуточной обработки. В противном случае запрос зависнет.

Приложение Express может использовать следующие типы промежуточных обработчиков:

  • Промежуточный обработчик уровня приложения
  • Промежуточный обработчик уровня маршрутизатора
  • Промежуточный обработчик для обработки ошибок
  • Встроенные промежуточные обработчики
  • Промежуточные обработчики сторонних поставщиков ПО

Промежуточные обработчики уровня приложения и уровня маршрутизатора можно загружать с помощью необязательного пути для монтирования. Также можно загрузить последовательность функций промежуточной обработки одновременно, в результате чего создается вспомогательный стек системы промежуточных обработчиков в точке монтирования.

Промежуточный обработчик уровня приложения

Свяжите промежуточный обработчик уровня приложения с экземпляром объекта приложения, воспользовавшись функциями app.use() и app.METHOD() , где METHOD — метод HTTP запроса, обрабатываемый функцией промежуточной обработки (например, GET, PUT или POST) в нижнем регистре.

В данном примере представлена функция промежуточной обработки без пути монтирования. Эта функция выполняется при каждом получении запроса приложением.

 var app = express(); app.use(function (req, res, next) < console.log('Time:', Date.now()); next(); >); 

В данном примере представлена функция промежуточной обработки, монтируемая в путь /user/:id . Эта функция выполняется для всех типов запросов HTTP в пути /user/:id .

 app.use('/user/:id', function (req, res, next) < console.log('Request Type:', req.method); next(); >); 

В данном примере представлен маршрут и функция его обработки (система промежуточных обработчиков). Эта функция обрабатывает запросы GET, адресованные ресурсам в пути /user/:id .

 app.get('/user/:id', function (req, res, next) < res.send('USER'); >); 

Ниже приводится пример загрузки последовательности функций промежуточной обработки в точку монтирования, с указанием пути монтирования. Этот пример иллюстрирует создание вспомогательного стека промежуточных обработчиков, с выводом информации о запросе для всех типов запросов HTTP, адресованных ресурсам в пути /user/:id .

 app.use('/user/:id', function(req, res, next) < console.log('Request URL:', req.originalUrl); next(); >, function (req, res, next) < console.log('Request Type:', req.method); next(); >); 

Обработчики маршрутов позволяют определить несколько маршрутов для одного пути. В приведенном ниже примере определено два маршрута для запросов GET, адресованных ресурсам в пути /user/:id . Второй маршрут не создает никаких неудобств, но его вызов никогда не будет выполнен, поскольку первый маршрут завершает цикл “запрос-ответ”.

В данном примере представлен вспомогательный стек промежуточных обработчиков для обработки запросов GET, адресованных ресурсам в пути /user/:id .

 app.get('/user/:id', function (req, res, next) < console.log('ID:', req.params.id); next(); >, function (req, res, next) < res.send('User Info'); >); // handler for the /user/:id path, which prints the user ID app.get('/user/:id', function (req, res, next) < res.end(req.params.id); >); 

Для того чтобы пропустить остальные функции дополнительной обработки в стеке промежуточных обработчиков маршрутизатора, вызовите next(‘route’) для передачи управления следующему маршруту. ПРИМЕЧАНИЕ: next(‘route’) работает только в функциях промежуточной обработки, загруженных с помощью функций app.METHOD() или router.METHOD() .

В данном примере представлен вспомогательный стек промежуточных обработчиков для обработки запросов GET, адресованных ресурсам в пути /user/:id .

 app.get('/user/:id', function (req, res, next) < // if the user ID is 0, skip to the next route if (req.params.id == 0) next('route'); // otherwise pass the control to the next middleware function in this stack else next(); // >, function (req, res, next) < // render a regular page res.render('regular'); >); // handler for the /user/:id path, which renders a special page app.get('/user/:id', function (req, res, next) < res.render('special'); >); 

Промежуточный обработчик уровня маршрутизатора

Промежуточный обработчик уровня маршрутизатора работает так же, как и промежуточный обработчик уровня приложения, но он привязан к экземпляру express.Router() .

 var router = express.Router(); 

Загрузите промежуточный обработчик уровня маршрутизатора с помощью функций router.use() и router.METHOD() .

В приведенном ниже примере с помощью промежуточного обработчика уровня маршрутизатора создается копия системы промежуточных обработчиков, представленной выше для обработчиков уровня приложения:

 var app = express(); var router = express.Router(); // a middleware function with no mount path. This code is executed for every request to the router router.use(function (req, res, next) < console.log('Time:', Date.now()); next(); >); // a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path router.use('/user/:id', function(req, res, next) < console.log('Request URL:', req.originalUrl); next(); >, function (req, res, next) < console.log('Request Type:', req.method); next(); >); // a middleware sub-stack that handles GET requests to the /user/:id path router.get('/user/:id', function (req, res, next) < // if the user ID is 0, skip to the next router if (req.params.id == 0) next('route'); // otherwise pass control to the next middleware function in this stack else next(); // >, function (req, res, next) < // render a regular page res.render('regular'); >); // handler for the /user/:id path, which renders a special page router.get('/user/:id', function (req, res, next) < console.log(req.params.id); res.render('special'); >); // mount the router on the app app.use('/', router); 

Промежуточный обработчик для обработки ошибок

Промежуточный обработчик ошибок всегда содержит четыре аргумента. Для определения данной функции как обработчика ошибок необходимо указать четыре аргумента. Даже если вам не нужно использовать объект next , необходимо указать его, чтобы сохранить сигнатуру. В противном случае, объект next будет интерпретирован как обычный промежуточный обработчик, который не будет обрабатывать ошибки.

Определите функции промежуточного обработчика для обработки ошибок так же, как другие функции промежуточной обработки, но с указанием не трех, а четырех аргументов в сигнатуре (err, req, res, next) ):

 app.use(function(err, req, res, next) < console.error(err.stack); res.status(500).send('Something broke!'); >); 

Подробная информация о промежуточном обработчике ошибок приведена в разделе Обработка ошибок.

Встроенные промежуточные обработчики

Начиная с версии 4.x, Express не является зависимым от Connect. За исключением express.static , все функции промежуточной обработки, ранее включенные в Express, находятся в отдельных модулях. Ознакомьтесь со списком функций промежуточной обработки.

express.static(root, [options])

Единственной встроенной функцией промежуточной обработки в Express является express.static . Эта функция основана на serve-static и отвечает за предоставление статических ресурсов приложения Express.

Аргумент root указывает на корневой каталог, из которого предоставляются статические ресурсы.

Необязательный объект options может содержать следующие свойства:

Свойство Описание Тип По умолчанию
dotfiles Опция для предоставления файлов с точкой. Возможные значения — “allow”, “deny”, “ignore” Строка “ignore”
etag Включение или отключение генерации etag Булевский true
extensions Установка альтернативных вариантов расширений файлов. Массив []
index Отправка файла индекса каталога. Установите значение false , чтобы отключить индексацию каталога. Смешанный “index.html”
lastModified Установка в заголовке Last-Modified даты последнего изменения файла в ОС. Возможные значения: true или false . Булевский true
maxAge Установка значения свойства max-age в заголовке Cache-Control, в миллисекундах, или в виде строки в формате ms Число 0
redirect Перенаправление к заключительному символу “/”, если имя пути — это каталог. Булевский true
setHeaders Функция для установки заголовков HTTP, предоставляемых с файлом. Функция

Ниже приводится пример использования функции промежуточной обработки express.static с объектом дополнительных опций:

 var options = < dotfiles: 'ignore', etag: false, extensions: ['htm', 'html'], index: false, maxAge: '1d', redirect: false, setHeaders: function (res, path, stat) < res.set('x-timestamp', Date.now()); >> app.use(express.static('public', options)); 

Для каждого приложения допускается наличие нескольких статических каталогов:

 app.use(express.static('public')); app.use(express.static('uploads')); app.use(express.static('files')); 

Дополнительную информацию о функции serve-static и ее опциях можно найти в документации по serve-static.

Промежуточные обработчики сторонних поставщиков ПО

Для расширения функциональности приложений Express используются промежуточные обработчики сторонних поставщиков ПО.

Установите модуль Node.js для соответствующей функциональной возможности, затем загрузите его в приложение на уровне приложения или на уровне маршрутизатора.

В приведенном ниже примере показана установка и загрузка функции промежуточной обработки для синтаксического анализа cookie cookie-parser .

$ npm install cookie-parser 
 var express = require('express'); var app = express(); var cookieParser = require('cookie-parser'); // load the cookie-parsing middleware app.use(cookieParser()); 

Список функций промежуточных обработчиков, предоставляемых сторонними поставщиками ПО и часто используемых в Express, приведен в разделе Промежуточные обработчики сторонних поставщиков ПО.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *