Wie kann ich den Antwortheader für die Assets von express.js festlegen?

164

Ich muss CORS so einstellen, dass es für Skripte aktiviert ist, die von Express bereitgestellt werden. Wie kann ich die Header in diesen zurückgegebenen Antworten für public / Assets festlegen?

Dr.Knowitall
quelle

Antworten:

357

Auf npm gibt es mindestens eine Middleware für die Verarbeitung von CORS in Express: cors . [siehe @ mscdex Antwort]

So legen Sie benutzerdefinierte Antwortheader im ExpressJS-DOC fest

res.set(field, [value])

Setzen Sie das Header-Feld auf den Wert

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

oder übergeben Sie ein Objekt, um mehrere Felder gleichzeitig festzulegen.

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

Aliased als

res.header(field, [value])
klode
quelle
Wie kann ich diese Werte erhalten? Weil ich diese Werte im resObjekt gesetzt habe. Wenn ich versuche, diesen Inhalt zu sehen, gehe ich undefiniert mit res.headers;
Bruno Casali
Dann benutze ich res.write('content')?
George
1
Diese Zeile sollte vor dem Schreiben des Kopfes verwendet werden.
Virendra Singh Rathore
Aus irgendeinem Grund res.sethat es bei mir nicht funktioniert, aber die corsMiddleware hat den Trick genau richtig gemacht.
Cezar D.
@BrunoCasali zusätzliche Header werden standardmäßig vom Browser blockiert, siehe stackoverflow.com/a/37931084/1507207
sbk201
48

Das ist so nervig.

Okay, wenn noch jemand Probleme hat oder einfach keine weitere Bibliothek hinzufügen möchte. Alles, was Sie tun müssen, ist, diese mittlere Codezeile vor Ihren Routen zu platzieren.

Cors Beispiel

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
quelle
1
Wichtig dieser Punkt in Bezug auf die Bestellung. Ich habe mich gefragt, ob es wirklich wichtig ist, da ich beim Ändern unterschiedliche Verhaltensweisen gesehen habe. Nett. Danke
Alejandro Teixeira Muñoz
1
Schön: das Problem perfekt gelöst. Das Hinzufügen einer vollständigen Abhängigkeit zur Ausführung dieser 6 Codezeilen ist keine Straße, die ich jedem empfehlen würde ...
Alex Clark
11

Sie können dies mit cors tun. cors kümmert sich um Ihre CORS-Antwort

var cors = require('cors')

app.use(cors());
Rahul Solanki
quelle
10

Kurze Antwort:

  • res.setHeaders - ruft die native Node.js-Methode auf

  • res.set - Setzt Header

  • res.headers - Ein Alias ​​für res.set

Charlie
quelle
9

Auf npm gibt es mindestens eine Middleware für die Verarbeitung von CORS in Express: cors .

mscdex
quelle
7

Sie können auch eine Middleware hinzufügen, um CORS-Header hinzuzufügen. So etwas würde funktionieren:

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

@ klodes Antwort ist richtig.

Sie sollten jedoch einen anderen Antwortheader festlegen, um Ihren Header für andere zugänglich zu machen.


Beispiel:

Zuerst fügen Sie im Antwortheader die Seitengröße hinzu

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

Dann müssen Sie nur noch Ihren Header offenlegen

response.set('Access-Control-Expose-Headers', 'page-size')
kpanodrean
quelle
Ich war über eine Stunde lang festgefahren, um herauszufinden, warum keiner meiner benutzerdefinierten Header es bis zum anderen Ende schaffte. Sie aufzudecken war die Antwort. Ich danke dir sehr! Warum dieser Header in den Express-Dokumenten (oder in Artikeln, die ich bisher über benutzerdefinierte Header gelesen habe) nicht erwähnt wird, ist sehr rätselhaft.
Devin Spikowski
Was wäre, wenn Sie 2 Header hätten? So: javascript res.set("...","..."); res.set("...","...."); Wie legen Sie nun diese beiden Header frei?
Cursor
Ich entdeckte, wie man die Dokumente liest:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Cursor