Làm cách nào tôi có thể đặt tiêu đề phản hồi trên tài sản express.js


164

Tôi cần đặt CORS để được bật trên các tập lệnh được phân phát bởi express. Làm cách nào tôi có thể đặt tiêu đề trong các phản hồi được trả lại này cho công chúng / tài sản?

Câu trả lời:


358

Có ít nhất một phần mềm trung gian trên npm để xử lý CORS trong Express: cors . [xem câu trả lời @mscdex]

Đây là cách đặt tiêu đề phản hồi tùy chỉnh, từ ExpressJS DOC

res.set(field, [value])

Đặt trường tiêu đề thành giá trị

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

hoặc vượt qua một đối tượng để đặt nhiều trường cùng một lúc.

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

Bí danh là

res.header(field, [value])

Làm thế nào tôi có thể nhận được những giá trị này? Bởi vì tôi đặt các giá trị này trong resđối tượng. Khi tôi cố gắng xem nội dung này, tôi không xác định được bằng cách sử dụng res.headers;
Bruno Casali

Sau đó tôi dùng res.write('content')?
George

1
Dòng này nên được sử dụng trước khi viết đầu.
Virendra Singh Rathore

Vì một số lý do res.setkhông làm việc cho tôi, nhưng corsphần mềm trung gian đã thực hiện thủ thuật vừa phải.
Cezar D.

Theo mặc định, các tiêu đề phụ của @BrunoCasali bị chặn bởi trình duyệt, xem stackoverflow.com/a/37931084/1507207
sbk201

48

Điều này thật khó chịu.

Được rồi nếu bất cứ ai vẫn gặp vấn đề hoặc chỉ không muốn thêm một thư viện khác. Tất cả bạn phải làm là đặt dòng mã trung gian này trước các tuyến đường của bạn.

Ví dụ 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
Quan trọng điểm này liên quan đến thứ tự. Tôi đã tự hỏi nếu nó thực sự quan trọng khi tôi thấy các hành vi khác nhau khi thay đổi nó. Đẹp. Cảm ơn
Alejandro Teixeira Muñoz

1
Nice: giải quyết vấn đề một cách hoàn hảo. Thêm toàn bộ phụ thuộc để thực hiện 6 dòng mã này không phải là con đường mà tôi muốn giới thiệu cho bất cứ ai ...
Alex Clark

11

Bạn có thể làm điều này bằng cách sử dụng cors. Cors sẽ xử lý phản hồi CORS của bạn

var cors = require('cors')

app.use(cors());

10

Câu trả lời ngắn:

  • res.setHeaders - gọi phương thức Node.js riêng

  • res.set - đặt tiêu đề

  • res.headers - một bí danh để res.set


9

Có ít nhất một phần mềm trung gian trên npm để xử lý CORS trong Express: cors .


7

Bạn cũng có thể thêm một phần mềm trung gian để thêm các tiêu đề CORS, một cái gì đó như thế này sẽ hoạt động:

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

Câu trả lời của @ klode là đúng.

Tuy nhiên, bạn phải đặt một tiêu đề phản hồi khác để làm cho tiêu đề của bạn có thể truy cập được.


Thí dụ:

Đầu tiên, bạn thêm 'kích thước trang' trong tiêu đề phản hồi

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

Sau đó, tất cả những gì bạn cần làm là để lộ tiêu đề của bạn

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

Tôi đã bị mắc kẹt trong hơn một giờ cố gắng tìm hiểu tại sao không có tiêu đề tùy chỉnh nào của tôi được đưa đến đầu kia. Phơi bày chúng là câu trả lời. Cảm ơn bạn rất nhiều! Tại sao tiêu đề này không được đề cập trong tài liệu Express (hoặc trong bất kỳ bài viết nào tôi đã đọc từ trước đến nay về tiêu đề tùy chỉnh) rất khó hiểu.
Devin Spikowski

Nếu bạn có 2 tiêu đề thì sao? Như thế này: javascript res.set("...","..."); res.set("...","...."); Bây giờ làm thế nào để bạn tiếp xúc với 2 tiêu đề đó?
Con trỏ

Tôi đã khám phá cách đọc các tài liệu:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Con trỏ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.