Socket.io Heroku 请求超时

4

我正在使用最新版本的Socket.IO(1.3.6)和Node.js在Heroku平台上,我使用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
...

他可以正常发送和接收消息,但是例如当他关闭浏览器标签时,断开连接事件不会被触发,服务器端的连接超时。这个客户端位于公司网页代理后面。
以下是服务器端的代码:
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个回答

0
你需要使用一个 http 服务器来包装 socket.io

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接