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


166

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

Ответы:


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])

Как я могу получить эти значения? Потому что я устанавливаю эти значения в 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 .


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();
    }
};


3

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

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


Пример:

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

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

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

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

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

Что делать, если у вас было 2 заголовка? javascript res.set("...","..."); res.set("...","...."); Вот так : Теперь, как вы выставляете эти 2 заголовка?
Курсор

Я узнал, как читать документы:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Курсор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.