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

166

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

Dr.Knowitall
источник

Ответы:

359

На 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
источник
Как я могу получить эти значения? Потому что я устанавливаю эти значения в resобъекте. Когда я пытаюсь увидеть этот контент, я использую неопределенное использование res.headers;
Бруно Казали
Тогда я пользуюсь res.write('content')?
Джордж
1
Эта строка должна быть использована перед написанием головы.
Вирендра Сингх Ратхор
По какой-то причине res.setу меня ничего не вышло, но corsпромежуточное ПО сделало все правильно.
Цезарь Д.
@BrunoCasali дополнительные заголовки блокируются браузером по умолчанию, см stackoverflow.com/a/37931084/1507207
sbk201
48

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

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

Пример Cors

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)=> {...});
следующий месяц
источник
1
Важно этот момент относительно порядка. Мне было интересно, действительно ли это было важно, так как я видел различное поведение при его изменении. Ницца. Спасибо
Алехандро Тейшейра Муньос
1
Приятно: решил проблему отлично. Добавление всей зависимости для выполнения этих 6 строк кода - это не тот путь, который я бы рекомендовал для всех ...
Алекс Кларк,
11

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

var cors = require('cors')

app.use(cors());
Рахул Соланки
источник
10

Короткий ответ:

  • res.setHeaders - вызывает собственный метод Node.js

  • res.set - устанавливает заголовки

  • res.headers - псевдоним для res.set

Чарли
источник
9

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

MSCDEX
источник
7

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

/**
 * Adds CORS headers to the response
 *
 * {@link https://en.wikipedia.org/wiki/Cross-origin_resource_sharing}
 * {@link http://expressjs.com/en/4x/api.html#res.set}
 * @param {object} request the Request object
 * @param {object} response the Response object
 * @param {function} next function to continue execution
 * @returns {void}
 * @example
 * <code>
 * const express = require('express');
 * const corsHeaders = require('./middleware/cors-headers');
 *
 * const app = express();
 * app.use(corsHeaders);
 * </code>
 */
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();
    }
};
magikMaker
источник
4

service.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    next();
  });

Титикан Чоэйбамрунг
источник
3

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

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


Пример:

Сначала вы добавляете «размер страницы» в заголовок ответа.

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

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

response.set('Access-Control-Expose-Headers', 'page-size')
kpanodrean
источник
Я застрял более часа, пытаясь понять, почему ни один из моих пользовательских заголовков не добрался до другого конца. Разоблачение их было ответом. Спасибо вам большое! Почему этот заголовок не упоминается в документах Express (или в каких-либо статьях о пользовательских заголовках, которые я до сих пор читал) очень озадачивает.
Девин Спиковски
Что делать, если у вас было 2 заголовка? javascript res.set("...","..."); res.set("...","...."); Вот так : Теперь, как вы выставляете эти 2 заголовка?
Курсор
Я узнал, как читать документы:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Курсор