ฉันจะตั้งค่าส่วนหัวการตอบสนองในเนื้อหาของ express.js ได้อย่างไร


164

ฉันต้องตั้งค่า CORS ให้เปิดใช้งานสคริปต์ที่ให้บริการโดยด่วน ฉันจะตั้งค่าส่วนหัวในการตอบกลับที่ส่งคืนสำหรับสาธารณะ / เนื้อหาได้อย่างไร

คำตอบ:


358

มีอย่างน้อยหนึ่งตัวกลางใน NPM สำหรับการจัดการล ธ in Express: ล ธ [ดู @mscdex คำตอบ]

นี่คือวิธีการตั้งค่าส่วนหัวการตอบสนองที่กำหนดเองจากExpressJS DOC

res.set(field, [value])

ตั้งค่าฟิลด์ส่วนหัวเป็นค่า

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

หรือผ่านวัตถุเพื่อตั้งค่าหลายฟิลด์ในครั้งเดียว

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

นามแฝงว่า

res.header(field, [value])

ฉันจะรับค่าเหล่านี้ได้อย่างไร เพราะฉันตั้งค่าเหล่านี้ในresวัตถุ เมื่อฉันลองดูเนื้อหานี้ฉันไม่ได้กำหนดโดยใช้res.headers;
Bruno Casali

ถ้าอย่างนั้นฉันจะใช้res.write('content')?
George

1
ควรใช้บรรทัดนี้ก่อนเขียนส่วนหัว
Virendra Singh Rathore

ด้วยเหตุผลบางอย่างres.setไม่ได้ผลสำหรับฉัน แต่corsมิดเดิลแวร์ทำเคล็ดลับได้ถูกต้อง
Cezar D.

@BrunoCasali ส่วนหัวพิเศษถูกบล็อกโดยเบราว์เซอร์โดยค่าเริ่มต้นดูstackoverflow.com/a/37931084/1507207
sbk201

48

มันน่ารำคาญมาก

ตกลงถ้าใครยังมีปัญหาอยู่หรือไม่ต้องการเพิ่มห้องสมุดอื่น สิ่งที่คุณต้องทำคือการวางรหัสกลางพัสดุไว้ก่อนเส้นทางของคุณ

ตัวอย่าง 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
สิ่งสำคัญจุดนี้สัมพันธ์กับใบสั่ง ฉันสงสัยว่าจริงๆแล้วมันสำคัญหรือไม่ที่ฉันเห็นพฤติกรรมที่แตกต่างเมื่อทำการเปลี่ยนแปลง ดี ขอบคุณ
Alejandro Teixeira Muñoz

1
ดี: แก้ไขปัญหาได้อย่างสมบูรณ์แบบ การเพิ่มการพึ่งพาทั้งการดำเนินการเหล่านี้ 6 บรรทัดของรหัสไม่ได้เป็นถนนที่ผมอยากจะแนะนำสำหรับทุกคน ...
อเล็กซ์คลาร์ก

11

คุณสามารถทำได้โดยใช้ cors cors จะจัดการกับคำตอบ CORS ของคุณ

var cors = require('cors')

app.use(cors());

10

คำตอบสั้น ๆ :

  • res.setHeaders - เรียกเมธอด Node.js ดั้งเดิม

  • res.set - ตั้งค่าส่วนหัว

  • res.headers - นามแฝงที่จะ res.set


9

มีอย่างน้อยหนึ่งตัวกลางใน NPM สำหรับการจัดการล ธ in Express: ล ธ


7

คุณสามารถเพิ่มมิดเดิลแวร์เพื่อเพิ่มส่วนหัว CORS สิ่งนี้จะทำงาน:

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

คำตอบของ @klode นั้นถูกต้อง

อย่างไรก็ตามคุณควรตั้งค่าส่วนหัวการตอบสนองอื่นเพื่อให้ผู้อื่นสามารถเข้าถึงส่วนหัวได้


ตัวอย่าง:

ก่อนอื่นคุณเพิ่ม 'ขนาดหน้า' ในส่วนหัวการตอบกลับ

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

จากนั้นสิ่งที่คุณต้องทำคือเปิดเผยส่วนหัวของคุณ

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

ฉันติดอยู่นานกว่าหนึ่งชั่วโมงเพื่อหาสาเหตุว่าทำไมไม่มีส่วนหัวที่กำหนดเองของฉันทำให้ส่วนอื่น ๆ การเปิดเผยพวกเขาคือคำตอบ ขอบคุณมาก! เหตุใดส่วนหัวนี้มีการกล่าวถึงเป็นศูนย์ในเอกสารด่วน (หรือในบทความใด ๆ ที่ฉันได้อ่านมาจนถึงตอนนี้เกี่ยวกับส่วนหัวที่กำหนดเอง) ทำให้งงงวยมาก
Devin Spikowski

ถ้าคุณมี 2 หัว เช่นนี้javascript res.set("...","..."); res.set("...","...."); คุณจะแสดงส่วนหัวทั้งสองเหล่านี้อย่างไร
เคอร์เซอร์

ฉันค้นพบวิธีอ่านเอกสาร:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
เคอร์เซอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.