2015-01-30 16 views
5

Tôi đang cố gắng tìm hiểu nodej với socket.io và tại thời điểm này tôi đang sử dụng this tutorial by GianlucaGuarini. Khi nhập tệp client.html của tôi, tôi nhận được lỗi sau. Tôi biết nó có nghĩa là gì và nó ở đó để ngăn chặn các kịch bản trình duyệt Cross nhưng tôi không biết cách cho phép tập lệnh nodejs của tôi truy cập vào tệp client.html.Socket.io Không có tiêu đề 'Access-Control-Allow-Origin' xuất hiện trên tài nguyên được yêu cầu. Do đó, gốc 'http: // localhost' không được phép truy cập

XMLHttpRequest cannot load http://localhost:8000/socket.io/?EIO=3&transport=polling&t=1422653081432-10. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. 

Đây là một phần của mã của tôi có ổ cắm.

var app = require('http').createServer(handler), 
    io = require('socket.io').listen(app), 
    fs = require('fs'), 
    mysql = require('mysql'), 
    connectionsArray = [], 
    connection = mysql.createConnection({ 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'database', 
    port: 3306 
    }), 
    POLLING_INTERVAL = 3000, 
    pollingTimer; 

// If there is an error connecting to the database 
connection.connect(function(err) { 
    // connected! (unless `err` is set) 
    console.log(err); 
}); 

// creating the server (localhost:8000) 
app.listen(8000); 

// on server started we can load our client.html page 
function handler(req, res) { 

    res.writeHead(200, { 
     /// ... 
     'Access-Control-Allow-Origin' : '*' 
    }); 

    fs.readFile(__dirname + '/client.html', function(err, data) { 
    if (err) { 
     console.log(err); 
     res.writeHead(500); 
     return res.end('Error loading client.html'); 
    } 
    res.writeHead(200); 
    res.end(data); 
    }); 
} 

Có ai biết cách giải quyết vấn đề của tôi không?

Quan tâm/H

+0

Bạn cần đặt tiêu đề 'Access-Control-Allow-Origin'. Bạn đang sử dụng Node.JS thuần túy hay có thể là Express? – Aweary

+0

Tôi không sử dụng Express như bạn có thể truy cập ngay trong câu hỏi đã chỉnh sửa. Tôi sẽ đặt Access-Control-Allow-Origin ở đâu? – hgerdin

+0

Client.html của bạn trông như thế nào? –

Trả lời

5

Trước hết, hãy ngừng sử dụng writeHead ở khắp mọi nơi. Bởi vì nó viết lại các tiêu đề phản hồi hoàn toàn.

Nếu tour du lịch ghi như thế này:

res.writeHead(200,{"coolHeader":"YesIAm"}); 
res.writeHead(500); 

sau đó Node.js sẽ gửi câu trả lời chỉ có tư cách 500 và không có tiêu đề "coolHeader";

Nếu bạn muốn thay đổi Status Code, sau đó sử dụng

res.statusCode = ###; 

Nếu bạn muốn thêm sử dụng tiêu đề mới

res.setHeader("key", "value"); 

Và nếu bạn muốn viết lại tất cả các tiêu đề sau đó sử dụng writeHeader(...)

thứ hai. Thêm mã này

res.statusCode = 200; 
//... 
res.setHeader("Access-Control-Allow-Origin", "*"); 
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 

thay vì bạn

res.writeHead(200, { 
     /// ... 
     'Access-Control-Allow-Origin' : '*' 
    }); 

và thay thế tất cả writeHead(###) với res.statusCode = ###;

4

Thử đặt tiêu đề `Access-Control-Allow-Origin 'trên đối tượng phản hồi của bạn trong Nút.

response.writeHead(200, { 
     /// ... 
     'Access-Control-Allow-Origin' : '*' 
    }); 
+0

Tôi đã chỉnh sửa câu hỏi của mình ngay bây giờ với một số mã. Nó không làm việc cho tôi nhưng tôi có thể thất lạc mã "kiểm soát truy cập". – hgerdin

2

Hình như bạn đang gọi .listen cho cả ứng dụng và socket.io (Tôi tin rằng dư thừa kể từ khi bạn mở rộng máy chủ của mình bằng socket.io)

Tôi có một phần nhỏ hoạt động tốt đối với tôi khi sử dụng socket.io 1. x Tôi thích sử dụng https vì nó giết chết một số vấn đề với tường lửa và chống vi-rút, nhưng ví dụ này được viết lại thành http.

var http = require('http'), 
    socketio = require('socket.io'), 
    options={}, 
    port=8080; 


//start http 
var app = http.createServer(options, handler), 
    io = socketio(app, { 
     log: false, 
     agent: false, 
     origins: '*:*' 
     // 'transports': ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling'] 
    }); 

app.listen(port); 
console.log('listening on port ' + port); 
Các vấn đề liên quan