我正在尝试从其他站点访问socket.io服务器。它工作了几个星期,但现在我不断收到以下错误。从heroku上的服务器访问nodester上的服务器时会发生这种情况。错误是:
XMLHttpRequest cannot load http://site2.nodester.com/socket.io/xhr-polling//1311008802545.
Origin http://site1.heroku.com is not allowed by Access-Control-Allow-Origin.
Resource interpreted as Script but transferred with MIME type text/plain.
Uncaught SyntaxError: Unexpected identifier
以下是我与套接字的连接方式:
socket = new io.Socket(
'site2.nodester.com', {port: 80, rememberTransport: false}
);
这是服务器代码:
// requires
server = http.createServer(function(req, res){
// server stuffs
}),
server.listen(8362);
var io = io.listen(server),
// io code
答案 0 :(得分:5)
你configure socket.io仍然使用默认origins = *
或至少放origins = site1.heroku.com
答案 1 :(得分:4)
我遇到的问题是,从不同的位置为客户端socket.io.js提供服务。
您可以通过从尝试连接的同一服务器提供客户端js文件来避免此问题。
例如,我的初始客户端代码是这个,它抛出了错误
<script src="/socket.io/socket.io.js"></script>
var socket = io.connect('http://mydomain.com/');
一旦我将其修改为此,它就可以正常工作。
<script src="http://mydomain.com/socket.io/socket.io.js"></script>
var socket = io.connect('http://mydomain.com/');
我的服务器代码是,
var express = require('express');
var app = express();
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
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();
});
var server = http.createServer(app);
io = socketio.listen(server, {log:false, origins:'*:*'});
... //io.connect and events below
答案 2 :(得分:3)
我遇到了同样的问题而我没有得到解决。
我测试了很多配置:
io.set("origins","*");
io.set('transports', [
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
或
io.set("origins = *");
io.set('transports', [
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
或
var socket = io.listen(appS1,{origins: '*:*'});
感谢你的帮助:)
答案 3 :(得分:3)
它可能并不完全相关,但最终可以帮助一些可怜的灵魂解决这个问题:
我刚刚遇到从本地磁盘运行客户端(至少在Windows上),例如。 file:///c:/...
导致“null”原点,这将导致原点检查崩溃。尝试将客户端上传到远程网站并从那里开始。将原点保留在:上。
希望这可以帮助一些人。
答案 4 :(得分:3)
这对我有用
var app = require('express')()
, server = require('http').createServer(app)
, sio = require('socket.io');
var io = sio.listen(server, { origins: '*:*' });
答案 5 :(得分:0)
我通过从服务器本身加载客户端的socket.io.js解决了这个问题,而不是在站点上维护本地副本。在我的设置中,某个网站上有一个网页从服务器获取文件,该服务器位于不同的位置。
答案 6 :(得分:0)
一个简单的解决方法(感谢mattcodez):
io = io.listen(8888);
io.server.removeListener('request', io.server.listeners('request')[0]);
此问题存在漏洞,您可以阅读更多相关信息here:
答案 7 :(得分:0)
我通过更改一行客户端代码解决了这个问题。
我改变了
var socket = io('localhost');
到
var socket = io();