socket.io heroku 请求超时

Posted

技术标签:

【中文标题】socket.io heroku 请求超时【英文标题】:socket.io heroku request timeout 【发布时间】:2015-12-19 16:52:46 【问题描述】:

我在 Heroku 平台上使用 Socket.IO(最新版本 1.3.6)和 Node.js,我开发了一个用 express.js 构建的基本聊天应用程序。它适用于大多数通过聊天连接的客户,但对于一个客户,我从 heroku dyno 收到多个错误:

heroku router - - at=error code=H12 desc="Request timeout" method=GET path="/socket.io/?EIO=3&transport=polling&t=1442928164852-20&sid=OIjnoxv2RqP3ijBnAAAA" host=xxx.herokuapp.com fwd="x.x.x.x" dyno=web.1 connect=0ms service=30000ms status=503 bytes=0
heroku router - - at=error code=H12 desc="Request timeout" method=GET path="/socket.io/?EIO=3&transport=polling&t=1442924841606-16&sid=5yukgKd2YUl75t1rAAAI" host=xxx.herokuapp.com fwd="x.x.x.x" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0
...

他可以毫无问题地发送和接收消息,但是,例如,当他关闭浏览器的选项卡时,disconnect 事件不会被触发并且服务器端的连接超时。此客户端位于公司网络代理后面。

这是服务器端代码:

var heartbeatInterval = 50000;

socket.init = function( io ) 

    function sendHeartbeat() 
        setTimeout( sendHeartbeat, heartbeatInterval );
        io.emit('ping',  beat : 1 );
    

    io.on('connection', function( socket ) 

        var session = socket.handshake.session;
        var dateFormat = 'DD/MM à HH:mm:ss'
        var time = moment().tz('Europe/Paris').format( dateFormat );

        if( session.user ) 
            users.exist(session.user.name, function( exist ) 
                if( ! exist ) 
                    users.add( session.user );
                    users.list(function( usersList ) 
                        io.emit('user_new');
                        addBotMessage(io, time, session.user.name + " connected");
                        async.eachSeries(usersList, function( user, next ) 
                            io.emit('user_connected', user);
                            next();
                        , function() 
                            socket.on('pong', function( data ) 
                                debug('Pong received from client');
                            );
                            socket.on('message', function( message ) 
                                time = moment().tz('Europe/Paris').format( dateFormat );
                                if( message && message.length <= 1000 )
                                    addMessage(io, time, session.user, marked( message ));
                            );
                            socket.on('disconnect', function() 
                                users.remove( session.user.name );
                                time = moment().tz('Europe/Paris').format( dateFormat );
                                io.emit('user_disconnected', session.user.id);
                                addBotMessage(io, time, session.user.name + " disconnected");
                            );
                        );
                    );
                 else 
                    io.to( socket.id ).emit('already_connected');
                
            );
        
    );

    setTimeout( sendHeartbeat, heartbeatInterval );
;

我不知道如何解决这个问题,有什么想法/建议吗?

【问题讨论】:

【参考方案1】:

你需要用 http 服务器包裹 socket.io

【讨论】:

以上是关于socket.io heroku 请求超时的主要内容,如果未能解决你的问题,请参考以下文章

基于heroku socket.io服务器的heroku空闲连接超时

Memcachier 达到缓存限制时 Heroku 请求超时

节点 JS 发布请求导致 Heroku 严重错误请求超时 (503)

Heroku上NodeJs应用程序中的H12请求超时错误?

Heroku PHP - 从 Heroku 服务器到自身的 file_get_contents 导致 H12 请求超时

使用 db.query 方法 node.js 时出现 Heroku H12“请求超时”错误