Jak ustawić nagłówek odpowiedzi w zasobach express.js.

164

Muszę ustawić CORS, aby był włączony w skryptach obsługiwanych przez Express. Jak mogę ustawić nagłówki w tych zwróconych odpowiedziach dla publicznych / zasobów?

Dr Knowitall
źródło

Odpowiedzi:

358

Na npm istnieje co najmniej jedno oprogramowanie pośredniczące do obsługi CORS w Express: cors . [patrz odpowiedź @mscdex]

Oto jak ustawić niestandardowe nagłówki odpowiedzi z pliku DOC ExpressJS

res.set(field, [value])

Ustaw pole nagłówka na wartość

res.set('Content-Type', 'text/plain');

lub przekazać obiekt, aby ustawić wiele pól jednocześnie.

res.set({
  'Content-Type': 'text/plain',
  'Content-Length': '123',
  'ETag': '12345'
})

Z aliasem

res.header(field, [value])
klode
źródło
Jak mogę uzyskać te wartości? Ponieważ ustawiłem te wartości w resobiekcie. Kiedy próbuję zobaczyć tę zawartość, nieokreślony używając res.headers;
Bruno Casali
Wtedy używam res.write('content')?
George,
1
Tej linii należy użyć przed napisaniem głowy.
Virendra Singh Rathore
Z jakiegoś powodu res.setnie działało dla mnie, ale corsoprogramowanie pośredniczące zrobiło to dobrze.
Cezar D.
Dodatkowe nagłówki @BrunoCasali są domyślnie blokowane przez przeglądarkę, patrz stackoverflow.com/a/37931084/1507207
sbk201
48

To jest takie irytujące.

OK, jeśli ktoś nadal ma problemy lub po prostu nie chce dodawać kolejnej biblioteki. Wszystko, co musisz zrobić, to umieścić tę środkową linię kodu przed trasami.

Przykład 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)=> {...});
Proximo
źródło
1
Ważny ten punkt w odniesieniu do zamówienia. Zastanawiałem się, czy to naprawdę ważne, ponieważ widziałem różne zachowania podczas zmiany. Miły. Dzięki
Alejandro Teixeira Muñoz
1
Fajnie: doskonale rozwiązał problem. Dodanie całej zależności w celu wykonania tych 6 linii kodu nie jest drogą, którą polecałbym każdemu ...
Alex Clark
11

Możesz to zrobić za pomocą cors. cors zajmie się twoją odpowiedzią CORS

var cors = require('cors')

app.use(cors());
Rahul Solanki
źródło
10

Krótka odpowiedź:

  • res.setHeaders - wywołuje natywną metodę Node.js.

  • res.set - ustawia nagłówki

  • res.headers - alias do res.set

Charlie
źródło
9

Na npm istnieje co najmniej jedno oprogramowanie pośredniczące do obsługi CORS w Express: cors .

mscdex
źródło
7

Możesz również dodać oprogramowanie pośredniczące, aby dodać nagłówki CORS, coś takiego zadziała:

/**
 * 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
źródło
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();
  });

Thitikan Choeibamrung
źródło
3

Odpowiedź @ klode jest prawidłowa.

Jednak powinieneś ustawić inny nagłówek odpowiedzi, aby twój nagłówek był dostępny dla innych.


Przykład:

Najpierw dodajesz „rozmiar strony” w nagłówku odpowiedzi

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

Następnie wszystko, co musisz zrobić, to ujawnić swój nagłówek

response.set('Access-Control-Expose-Headers', 'page-size')
kpanodrean
źródło
Utknąłem przez ponad godzinę, próbując zrozumieć, dlaczego żaden z moich niestandardowych nagłówków nie dotarł na drugi koniec. Odpowiedzią było ich ujawnienie. Dziękuję bardzo! Dlaczego ten nagłówek nie ma wzmianki w dokumentach Express (lub w jakichkolwiek artykułach, które przeczytałem do tej pory na temat niestandardowych nagłówków), jest bardzo zagadkowe.
Devin Spikowski
A co by było, gdybyś miał 2 nagłówki? W ten sposób: javascript res.set("...","..."); res.set("...","...."); Jak teraz ujawnić te 2 nagłówki?
Kursor
Odkryłem, jak czytam dokumenty:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Kursor