Bagaimana saya bisa mengatur header respons pada aset express.js


164

Saya perlu mengatur CORS agar diaktifkan pada skrip yang dilayani oleh express. Bagaimana saya bisa mengatur header dalam respons yang dikembalikan untuk publik / aset ini?

Jawaban:


358

Setidaknya ada satu middleware di npm untuk menangani CORS di Express: cors . [lihat jawaban @mscdex]

Ini adalah cara mengatur header respons khusus, dari ExpressJS DOC

res.set(field, [value])

Setel bidang tajuk ke nilai

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

atau meneruskan objek untuk mengatur beberapa bidang sekaligus.

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

Diasingkan sebagai

res.header(field, [value])

Bagaimana saya bisa mendapatkan nilai-nilai ini? Karena saya menetapkan nilai-nilai ini di resobjek. Ketika saya mencoba melihat konten ini saya tidak menggunakan res.headers;
Bruno Casali

Lalu saya gunakan res.write('content')?
George

1
Baris ini harus digunakan sebelum menulis kepala.
Virendra Singh Rathore

Untuk beberapa alasan res.settidak berhasil bagi saya, tetapi corsmiddleware melakukan trik dengan benar.
Cezar D.

@BrunoCasali header ekstra diblokir oleh browser secara default, lihat stackoverflow.com/a/37931084/1507207
sbk201

48

Ini sangat menjengkelkan.

Oke jika ada yang masih mengalami masalah atau tidak ingin menambahkan perpustakaan lain. Yang harus Anda lakukan adalah menempatkan baris kode ware tengah ini sebelum rute Anda.

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

1
Penting titik ini relatif terhadap pesanan. Saya bertanya-tanya apakah itu benar-benar penting karena saya melihat perilaku yang berbeda ketika mengubahnya. Bagus. Terima kasih
Alejandro Teixeira Muñoz

1
Bagus: menyelesaikan masalah dengan sempurna. Menambahkan seluruh ketergantungan untuk melakukan 6 baris kode ini bukanlah jalan yang akan saya rekomendasikan untuk siapa pun ...
Alex Clark

11

Anda dapat melakukan ini dengan menggunakan kor. cors akan menangani respons CORS Anda

var cors = require('cors')

app.use(cors());

10

Jawaban singkat:

  • res.setHeaders - Memanggil metode Node.js asli

  • res.set - set header

  • res.headers - alias untuk res.set


9

Setidaknya ada satu middleware di npm untuk menangani CORS di Express: cors .


7

Anda juga dapat menambahkan middleware untuk menambahkan header CORS, sesuatu seperti ini akan berfungsi:

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

Jawaban @ klode benar.

Namun, Anda harus mengatur tajuk respons lain agar tajuk Anda dapat diakses orang lain.


Contoh:

Pertama, Anda menambahkan 'ukuran halaman' di header respons

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

Kemudian, yang perlu Anda lakukan adalah mengekspos tajuk Anda

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

Saya macet selama lebih dari satu jam mencoba mencari tahu mengapa tidak ada header kustom saya yang berhasil sampai ke ujung. Mengekspos mereka adalah jawabannya. Terima kasih banyak! Mengapa tajuk ini tidak disebutkan dalam dokumen Express (atau dalam artikel apa pun yang saya baca sejauh ini tentang tajuk ubahsuaian) sangat membingungkan.
Devin Spikowski

Bagaimana jika Anda memiliki 2 header? Seperti ini: javascript res.set("...","..."); res.set("...","...."); Sekarang bagaimana Anda mengekspos 2 header itu?
Kursor

Saya menemukan cara membaca dokumen:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Kursor
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.