Как установить заголовок ответа для ресурсов 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(); >);
Отправить ответ можно только один раз, повторная отправка приведет к ошибке.