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?

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

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)=> {...});

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

10

Kurze Antwort:

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

  • res.set - Setzt Header

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


9

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


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

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

@ 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')

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.