2014-05-15 203 views
0

我完全是Node.js的新手,我只是想讓一些示例代碼運行,但是我一直遇到與CORS相關的問題。CORS Node.js服務器

Server.js

var http = require('http'); 
    var io = require('socket.io'); 

server = http.createServer(function(req, res){  
}); 
server.listen(8080); 
// socket.io 
var socket = io.listen(server, { origins: '*:*' }); 

// Enables CORS 
var enableCORS = function(req, res, next) { 
res.header('Access-Control-Allow-Origin', '*'); 
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content- Length, X-Requested-With'); 

// intercept OPTIONS method 
if ('OPTIONS' == req.method) { 
    res.send(200); 
} 
else { 
    next(); 
} 
}; 


// enable CORS! 
socket.use(enableCORS); 
//-------------- 
socket.on('connection', function(client){ 
    client.on('message', function(msg){ 
    socket.broadcast(msg); 
    }) 
}); 

客戶端代碼:

var socket = io.connect('127.0.0.7:8080'); 
socket.on('message', function(msg){ 
alert(msg); 
console.log(msg); 
}); 

我嘗試安裝於Node.js的CORS模塊,但我不斷收到在Firefox調試器的消息,但我仍然不斷收到這樣的:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://8080/socket.io/1/?t=1400151675528. This can be fixed by moving the resource to the same domain or enabling CORS. 
ReferenceError: socket is not defined client2.html:8 
ReferenceError: socket is not defined 
+1

是被同一主機和端口的節點服務器上投放了您的客戶端代碼?如果沒有,請嘗試使用節點服務器爲您的客戶端代碼提供服務,以便使用相同的主機和端口。那麼你不應該有這個問題,因爲CORS不適用。另外,它看起來像你沒有框架使用原始節點。使用諸如Express.js(一個非常簡單的框架)之類的東西可以使服務靜態文件變得簡單(以及其他一些重要的事情)。對不起,如果我不直接回答你的問題。我不是CORS專家。但我喜歡Node,並想給你一些好的入門建議。祝你好運。 –

+0

服務器正在監聽8080,並且客戶端代碼正在監聽127.0.0.7:8080 – Seth

+0

127.0.0.1:8080 =/= 127.0.0.7:8080 ...因此,問題在於此問題。我的建議是花半小時學習Express並使用一臺服務器。否則,請了解HTTP頭以禁用CORS並手動設置它們。 –

回答

1

僅在目標服務器上設置CORS標頭是不夠的。您還需要爲服務於您的客戶端HTML文件的Web服務器設置適當的標頭。

由於您沒有提及您如何爲客戶端文件提供服務,因此我無法爲您發佈正確的解決方案。但是,如果你使用的是Apache httpd的,你可以把在配置或.htaccess如下:

Header add Access-Control-Allow-Origin "*" 
Header add Access-Control-Allow-Headers "origin, x-requested-with, x-http-method-override, content-type" 
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" 
+0

其XAMPP服務器 – Seth

+0

@Seth XAMPP使用Apache,因此上述應該可以工作。 – jgillich