Як встановити заголовок відповіді на ресурси express.js


164

Мені потрібно встановити CORS, щоб увімкнено сценарії, які обслуговуються експресом. Як я можу встановити заголовки у цих повернених відповідях для публікацій / активів?

Відповіді:


358

Існує щонайменше одне проміжне програмне забезпечення на 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

Це так дратує.

Добре, якщо хтось все ще має проблеми або просто не хоче додавати іншу бібліотеку. Все, що вам потрібно зробити, - це розмістити цей середній рядок коду до своїх маршрутів.

Приклад Корса

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

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

@ klode відповідь правильна.

Однак ви повинні встановити інший заголовок відповіді, щоб зробити його заголовком доступним для інших.


Приклад:

Спочатку ви додаєте "розмір сторінки" у заголовок відповіді

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.