2015-02-04 84 views
0

我試圖調用正在通過socket.io擔任了一個網頁,我得到以下錯誤:socket.io和jQuery負載

XMLHttpRequest cannot load http://foo.bar:12354/ . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://foo.bar ' is therefore not allowed access.

下面是我調用的頁面非常簡單JQ代碼:

$(document).ready(function() { 
    $('#x').load('http://foo.bar:12354'); 
}); 

這裏是我的簡單socket.io例如:

var app = require('express')(); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 
server.listen(12354); 
io.on('connection', function (socket) { 
     socket.emit('news', { hello: 'world' }); 
     socket.on('my other event', function (data) { 
       console.log(data); 
     }); 
}); 
app.get('/', function (req, res) { 
     res.sendFile(__dirname + '/index.html'); 
});          
app.use(function(req, res, next) { 
     res.header("Access-Control-Allow-Origin", "http://foo.bar:12354"); 
     res.header("Access-Control-Allow-Headers", "X-Requested-With"); 
     res.header("Access-Control-Allow-Headers", "Content-Type"); 
     res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS"); 
     next(); 
}); 

當我拉起來,直接使用頁面頁面加載正常。

一個論壇上建議,我需要包括阿帕奇CORS審批,但把這個變成一個點接入沒有幫助:

Header set Access-Control-Allow-Origin "*" 

這似乎是它應該是一個相當簡單的任務,但它有我難住了。任何建議都會讓人感激。

+0

嘗試將「Access-Control-Allow-Origin」添加到您的快速app.use:'res.header(「Access-Control-Allow-Origin」,「*」);' – pherris

+0

謝謝pherris - 那是我嘗試的第一件事。我還在res.header之前放置了一個console.log行。當我使用h t t p:// foo時,這條線會發射。酒吧/網址,但是當我使用jQ加載它根本不會啓動。這應該是對我很重要的線索,但我仍然沒有看到它。 – edwardsmarkf

+0

這是什麼代碼,index.html? '$(document).ready(function(){('#x').load('http://foo.bar:12354'); });' – pherris

回答

0

在這個例子中,express服務於你的靜態內容,所以你不需要用jQuery的load()方法來獲取你的頁面 - 你的內容就是任何HTML/JS/CSS在index.html文件中建立websocket連接到剛剛服務的服務器)。

它看起來從the docs表示和socket.io可以使用相同的端口(不需要交叉起源的東西)。所以,我建議切換到端口80,按照該如何向一區,但沒有了jQuery負載()的示例片:

var app = require('express').createServer(); 
var io = require('socket.io')(app); 

app.listen(80); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

的index.html

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

那麼你應該只能夠從瀏覽器中點擊http://foo.bar(端口80)並在瀏覽器和服務器上查看console.log。我不認爲你需要任何交叉源請求,因爲套接字連接到服務於靜態內容的相同端口。

+0

謝謝你弗里斯 - 我沒有讓自己完全清楚 - 所以我在這裏轉載問題:http://stackoverflow.com/questions/28372043/express-io-and-jquery – edwardsmarkf