我试图做一些相对简单的事情,至少是为了让事情开始。我在 openshift 上有两个齿轮,一个 php-5.4 和一个 node.js 齿轮。我的客户端文件是由php设备托管的,但我试图设置 socket.io 连接到节点服务器。
我意识到这会带来CORS问题 我试过在没有运气的情况下更新(很多)其他东西的标题。为了测试我只使用socket.io chat example。
我一直收到这个错误:
GET http://www.domain.com/socket.io/?EIO=3&transport=polling&t=1416040246016-0 404 (Not Found)`
如果我从通过express托管的index.html文件进行连接,它确实有用。
我对节点比较新,所以请原谅我在如何处理这个问题的假设中犯了一些错误。
所以这是代码。
服务器端:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var server = function(){
var strt = this;
strt.setHeaders = function(){
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://www.domain.com:8000,
http://domain.com:8000, http://node-domain.rhcloud.com:8000');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
next();
});
}
strt.setupVariables = function() {
strt.ipaddress = process.env.OPENSHIFT_NODEJS_IP;
strt.port = process.env.OPENSHIFT_NODEJS_PORT || 3000;
if (typeof strt.ipaddress === "undefined") {
console.warn('No OPENSHIFT_NODEJS_IP var, using 127.0.0.1');
strt.ipaddress = "127.0.0.1";
};
}
strt.createRoutes = function() {
app.get('/', function(req, res){
res.sendfile(__dirname + '/index.html');
});
}
strt.ioServer = function() {
io.on('connection', function(socket){
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
});
}
strt.initializeServer = function() {
http.listen(strt.port, strt.ipaddress, function(){
console.log('listening on *:8000');
});
}
}
var Start = new server();
Start.setHeaders();
Start.setupVariables();
Start.createRoutes();
Start.ioServer();
Start.initializeServer();
客户端:
<script src="http://node-metagenome.rhcloud.com:8000/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var socket = io().connect("http://node-domain.rhcloud.com:8000");
$('form').submit(function(){
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
});
</script>
答案 0 :(得分:1)
好的我明白了。这是一个相对较小的变化。
代替:
var socket = io().connect("http://node-domain.rhcloud.com:8000");
应该是:
var socket = io("http://node-domain.rhcloud.com:8000");
事实证明我也不需要设置标题。