Come posso impostare l'intestazione della risposta sugli asset express.js


166

Devo impostare CORS per essere abilitato sugli script serviti da express. Come posso impostare le intestazioni in queste risposte restituite per pubblico / beni?

Risposte:


359

Esiste almeno un middleware su npm per la gestione di CORS in Express: cors . [vedi risposta @mscdex]

Ecco come impostare le intestazioni di risposta personalizzate, da ExpressJS DOC

res.set(field, [value])

Imposta il campo dell'intestazione su valore

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

oppure passa un oggetto per impostare più campi contemporaneamente.

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

Alias ​​come

res.header(field, [value])

Come posso ottenere questi valori? Perché ho impostato questi valori resnell'oggetto. Quando provo a vedere questo contenuto vado indefinito usando res.headers;
Bruno Casali,

Quindi io uso res.write('content')?
George,

1
Questa riga deve essere utilizzata prima di scrivere la testa.
Virendra Singh Rathore,

Per qualche motivo res.setnon ha funzionato per me, ma il corsmiddleware ha fatto il trucco giusto.
Cezar D.

@BrunoCasali intestazioni supplementari sono bloccati da browser di default, vedere stackoverflow.com/a/37931084/1507207
sbk201

48

Questo è così fastidioso.

Va bene se qualcuno ha ancora problemi o semplicemente non vuole aggiungere un'altra libreria. Tutto quello che devi fare è posizionare questa riga di codice centrale prima dei tuoi percorsi.

Esempio di corsia

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
Importante questo punto relativo all'ordine. Mi chiedevo se fosse davvero importante quando ho visto comportamenti diversi quando lo ho cambiato. Bello. Grazie
Alejandro Teixeira Muñoz il

1
Bello: risolto perfettamente il problema. Aggiungere un'intera dipendenza per eseguire queste 6 righe di codice non è una strada che consiglierei a chiunque ...
Alex Clark

11

Puoi farlo usando cors. cors gestirà la tua risposta CORS

var cors = require('cors')

app.use(cors());

10

Risposta breve:

  • res.setHeaders - chiama il metodo Node.js nativo

  • res.set - imposta le intestazioni

  • res.headers - un alias da res.set


9

Esiste almeno un middleware su npm per la gestione di CORS in Express: cors .


7

Puoi anche aggiungere un middleware per aggiungere le intestazioni CORS, qualcosa del genere funzionerebbe:

/**
 * 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

La risposta di @ klode è giusta.

Tuttavia, è necessario impostare un'altra intestazione di risposta per renderla accessibile ad altri.


Esempio:

Innanzitutto, aggiungi "dimensione pagina" nell'intestazione della risposta

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

Quindi, tutto ciò che devi fare è esporre l'intestazione

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

Sono stato bloccato per oltre un'ora cercando di capire perché nessuna delle mie intestazioni personalizzate stava arrivando dall'altra parte. Esporre loro era la risposta. Grazie mille! Il motivo per cui questa intestazione non ha menzione nei documenti Express (o in tutti gli articoli che ho letto finora sulle intestazioni personalizzate) è molto sconcertante.
Devin Spikowski,

E se avessi 2 intestazioni? In questo modo: javascript res.set("...","..."); res.set("...","...."); ora come si espongono quelle 2 intestazioni?
Cursore

Ho scoperto come leggere i documenti:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Cursore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.