2016-03-28 21 views
5

Đã trải qua nhiều bài đăng trên chồng tôi vẫn không thể tìm thấy câu trả lời đúng.CORS node js issue

Kiểm tra tài liệu về số mở rộng CORS.

Tôi có đoạn code sau máy chủ và chạy:

var WebSocketServer = require("ws").Server 
var http = require("http") 
var express = require('express') 
var cors = require('cors') 
var app = express(); 

app.use(cors()); 
var port = process.env.PORT || 9000 

var server = http.createServer(app) 
server.listen(port) 
var count = 0; 
var clients = {}; 
var rooms = {}; 
var wss = new WebSocketServer({server: server}) 
wss.on("connection", function(ws) { 
    ws.on("create-room", function(data) { 
     rooms[data] = {creator : data.user_id, created : new Date()} 
    }) 
    ws.on("close", function() { 
     console.log("websocket connection close") 
    }) 
}) 

Nhưng tôi nhận được:

XMLHttpRequest không thể tải http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LE-CbU0. Không thể sử dụng ký tự đại diện ' ' * 'trong tiêu đề' Access-Control-Allow-Origin ' khi cờ thông tin xác thực là đúng. Do đó, nguồn gốc 'http://localhost:8100' không được phép truy cập. Chế độ thông tin đăng nhập của XMLHttpRequest được kiểm soát bởi thuộc tính withCredentials.

Nếu tôi nhận xét dòng với app.use(cors());

tôi nhận được:

XMLHttpRequest không thể tải http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LE-Cwb8. Không có tiêu đề 'Access-Control-Allow-Origin' có trên tài nguyên được yêu cầu . Xuất xứ 'http://localhost:8100' do đó không được phép truy cập . Câu trả lời đã có mã trạng thái HTTP 404.

Vì vậy, rõ ràng máy chủ của tôi là lên và chạy ok nhưng

Trả lời

8

Như thông báo lỗi cho biết, nguồn gốc wildcard Access-Control-Allow-Origin không thể được sử dụng với Access-Control-Allow-Credentials. Theo mặc định, mô-đun cors sử dụng nguồn gốc hoang dã và theo mặc định socket.io yêu cầu thông tin đăng nhập (hoặc có vẻ như ở đây, dù sao). Những gì bạn cần làm là đọc tiêu đề Origin của yêu cầu và đưa nó vào số Access-Control-Allow-Origin của phản hồi.

May mắn thay, cors làm việc này rất dễ dàng: để phản ánh nguồn gốc yêu cầu, chuyển vào đối tượng tùy chọn với thuộc tính origin: true. Bạn cũng cần một tài sản credentials: true để cho phép thông tin tại tất cả:

app.use(cors({ 
    origin: true, 
    credentials: true 
})); 
+0

Cảm ơn đã phản ứng, bây giờ tôi có được 'Credentials cờ là 'true', nhưng 'Access-Control-Allow-Credentials' tiêu đề là ''' –

+0

Cảm ơn bạn, đã làm các trick :). Tôi mới đến đây –

+0

Một câu hỏi mặc dù, bây giờ tôi nhận được 404 khi trình duyệt gọi url mặc dù ... Nếu tôi loại bỏ giải pháp của bạn tôi nhận được lỗi cors ... Đó là khó hiểu ... –