从客户端通过php gear连接到socket.io? - openshift

时间:2014-11-15 08:40:31

标签: node.js socket.io cors openshift

我试图做一些相对简单的事情,至少是为了让事情开始。我在 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>

1 个答案:

答案 0 :(得分:1)

好的我明白了。这是一个相对较小的变化。

代替:

var socket = io().connect("http://node-domain.rhcloud.com:8000");

应该是:

var socket = io("http://node-domain.rhcloud.com:8000");

事实证明我也不需要设置标题。