2013-05-30 58 views
2

最近我一直在试图建立我使用这个插件一个Ngnix服务器上的应用程序彗星服务器:https://github.com/wandenberg/nginx-push-stream-modulenginx的彗星长轮询与jQuery

由于GNU/GPL的约束性,我无法使用随插件提供的JS,所以我试图使用jquery ajax请求自己实现它。

我的Nginx的配置是这样的:

location /channels-stats { 
     # activate channels statistics mode for this location 
     push_stream_channels_statistics; 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 

     # query string based channel id 
     set $push_stream_channel_id    $arg_id; 
    } 

    location ~ /pub/(.*) { 
     # activate publisher (admin) mode for this location 
     push_stream_publisher admin; 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 

     # query string based channel id 
     set $push_stream_channel_id    $1; 
    } 

    location ~ /sub/(.*) { 
     # activate subscriber (streaming) mode for this location 
     push_stream_subscriber; 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 


     # positional channel path 
     set $push_stream_channels_path    $1; 
    } 

和代码段,我试图用(萤火虫)来测试这两种方式通信:

//reciever 
$.ajax({ 
    url:'sub/test?callback=mycallback', 
    dataType:'json', 
    success:function(data){ 
      console.log(data); 
    } 
}); 

//sender 
$.ajax({ 
    url:'pub/test', 
    dataType:'json', 
    type:'POST', 
    data:'mycallback({"J":5,"0":"N"})' 

}); 

我想使其工作跨域,但我无法设法让它工作,即使在同一个域上,发生什么acctualy是:

当我使用接收代码,它启动连接到s并且正在无休止地加载,因此我尝试用发送者代码来响应长轮询。

现在在.NET选项卡(firebug)的控制台上我可以看到,一旦我发送POST,它会以纯文本的形式在响应中收到它,但仍然保持连接而不会回拨!所以如果我反复发送帖子,我可以看到他们正在收集的网络响应标签中的萤火虫,但没有从接收器功能给出回调!因此我无法提取数据!

现在我试着这两个在另一个域和相同的原产地域,所以我认为这个政策不是问题在这里,什么问题是,jQuery的片段没有得到回调,虽然它确实达到回调一次请求超时! 请帮忙。

在旁边注释,如果你认为有一个替代插件NGINX这会更适合我请让我知道。

回答

2

确定后一些研究,我设法弄清楚,我在我的nginx的配置错误这使得连接无止境的,我把它改为:

location /channels-stats { 
     # activate channels statistics mode for this location 
     push_stream_channels_statistics; 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 

     # query string based channel id 
     set $push_stream_channel_id    $arg_id; 
    } 

    location ~ /pub/(.*) { 
     # activate publisher (admin) mode for this location 
     push_stream_publisher admin; 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 

     # query string based channel id 
     set $push_stream_channel_id    $1; 
    } 

    location ~ /sub/(.*) { 
     # activate subscriber (streaming) mode for this location 
     push_stream_subscriber long-polling; //<----------------------EDITED LINE 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 


     # positional channel path 
     set $push_stream_channels_path    $1; 
    } 

,我结束了两个小功能,双双向通信

var datalink={ 
     listen:function(success,error,complete,url){ 
     //reciever 
      $.ajax({ 
       url:url, 
       dataType:'jsonp', 
       success:success, 
       error:error, 
       complete:complete 
      }); 
     }, 
     send:function(data,success,error,complete,url){ 
     //sender 
      $.ajax({ 
       url:url, 
       dataType:'json', 
       success:success, 
       error:error, 
       complete:complete 
       type:'POST', 
       data:JSON.stringify(data) 
      }); 
     } 

    }; 

注:用于发送数据的功能,使用方法JSON.stringify(你的对象) 而大多数浏览器都支持它,它建议使用这样的事情: http://bestiejs.github.io/json3/ ,以便为json.stringfying添加对旧浏览器的支持。

使用示例:

从服务器侦听(订阅):

datalink.listen(function(data){ 

        console.log(data);//<---your recieved object 
           },undefined,undefined,'http://example.com/sub/foo'); 

发送到服务器(发布):

datalink.send({x:5}//<--the object you are about to send 
       ,undefined,undefined,undefined,'http://chessbless.com/pub/test'); 

所以这是我的解决方案,我希望你能找到这很有帮助,我道歉,如果有什么不清楚,第一次回答SO。