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?
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:
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])
res.write('content')
?
res.set
không làm việc cho tôi, nhưng cors
phần mềm trung gian đã thực hiện thủ thuật vừa phải.
Đ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)=> {...});
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();
}
};
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();
});
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')
javascript res.set("...","..."); res.set("...","....");
Bây giờ làm thế nào để bạn tiếp xúc với 2 tiêu đề đó?
javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
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ụngres.headers
;