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

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

  • автор:

Как установить заголовок ответа для ресурсов 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(); >>; 

Как задать заголовок 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?

Есть простое приложение на react.js localhost:3000
Есть простое серверное приложение на express.js localhost:5000
На сервере прописаны заголовки для cors, но при запросе в браузере все равно вылетает ошибка:
Access to XMLHttpRequest at ‘localhost:5000/auth/login’ from origin ‘localhost:3000’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

Что я делаю не так?
Я знаю про расширение(пакет) cors, но хотел бы решить вопрос без его установки, т.к. хочу понять механизм работы cors.
В подавляющем большинстве ответов от гугл необходимо добавить Access-Control-Allow-Origin’, ‘*’. Но у меня уже указан этот заголовок.
Правильно ли я понимаю, что сервер localhost:3000 должен сделать прерфлай запрос на localhost:5000 и в ответ получить заголовок Access-Control-Allow-Origin, значение которого должен быть как раз localhost:3000 или любой хост(*) ?

Запрос на сервер:

const onLogin = (e) => < e.preventDefault() console.log(username, password) axios .post('http://localhost:5000/auth/login', < headers: < 'Content-Type': 'application/json', >, body: < username: username, password: password, >, >) .then((res) => < console.log(res) >) >

Главный файл express.js

const express = require('express') const authRouter = require('./authRouter') const PORT = process.env.PORT | 5000 const app = express() app.use(express.json()) app.use('/auth', authRouter) app.use(function (req, res, next) < res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader('Access-Control-Allow-Methods', '*') res.setHeader('Access-Control-Allow-Headers', '*') res.setHeader('Access-Control-Allow-Credentials', true) next() >) const start = () => < try < app.listen(PORT, () =>< console.log('Server was started on port ', PORT) >) > catch (error) < console.log(error) >> start()
  • Вопрос задан 16 дек. 2023
  • 70 просмотров

6 комментариев

Простой 6 комментариев

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

Объект ответа в 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(); >); 

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

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

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