nginx彗星用jquery进行长轮询

时间:2013-05-30 17:06:48

标签: jquery nginx long-polling

最近,我一直在尝试使用此插件在Ngnix服务器上为我的应用程序设置一个彗星服务器:https://github.com/wandenberg/nginx-push-stream-module

由于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;
    }

和我试图使用的代码片段(在firebug中)来测试两种方式的通信:

//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"})'

});

我正在尝试让它跨域工作,但我无法让它在同一个域上工作,它会发生什么:

当我使用接收代码时,它会启动与服务器的连接并按原样无限地加载,然后我尝试使用发送者代码响应长轮询。

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

现在我在另一个域和同一个域中尝试了这个,所以我认为这里的策略不是问题,问题是jquery片段没有得到回调,尽管它确实达到了回调一旦请求超时! 请帮忙。

旁注,如果您认为NGINX有另一个插件适合我,请告诉我。

1 个答案:

答案 0 :(得分: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(your-object) 虽然大多数浏览器都支持它,但建议使用以下内容: 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。