1

어제 우리는이 문제를 해결하기 위해 더 많은 시간을 보냈습니다. 그래서 마지막 도랑 노력으로 나는 여기에 게시하고 있습니다.Socket.io IE7-9 JSONP 폴링 오류

우리의 설정은 Node.js/Express 백엔드입니다. Socket.io는 express와 같은 포트에 있습니다.

app.io = io.listen(server); 

app.io.set('origin', '*'); 
app.io.set('log level', '2'); 
app.io.enable('browser client minification'); 
app.io.set('transports', [ 
    'websocket', 
    'flashsocket', 
    'htmlfile', 
    'xhr-polling', 
    'jsonp-polling' 
]); 

모든 전송을 명시 적으로 사용하도록 설정했습니다. 우리는 jsonp 또는 플래시 소켓이 가장 선호하지 않는 브라우저에서 훌륭하게 재생되기를 바랬습니다 ...

하지만 우리가 가장 좋아하지 않는 이유가 있다고 생각합니다. ;-)

클라이언트 측 socket.io와 함께 Angularjs 애플리케이션이 있습니다. 아주 느슨하게 우리는 작업 flashsockets를 얻을 수 here을 볼 때 SWF의 위치를 ​​추가하려고했습니다 this tutorial

window.WEB_SOCKET_SWF_LOCATION = 'https://api.ourdomain.com/socket.io/static/flashsocket/WebSocketMain.swf'; 
var socket = io.connect('https://api.ourdomain.com', { 
    'reconnect' : true, 
    'reconnection delay' : 1500 
}); 

에 따라. 그것은 정책을 제공하고 파일을 받고 .. 그래서 운이 없다. 때때로 io.j[1]("1::");

와이 같은 될 JSONP 메시지의

Object doesn't support this property or method

내용 : 어쨌든 ie7-9에

는 우리가이 오류가 JSONP 폴링을 통해 연결을 시도 할 때 콘텐츠가 더 많습니다.

io.j가 주 socket.io.js 파일의 배열로 설정되어있는 것처럼 보입니다.

개발자 도구 콘솔에 넣으면 같은 오류가 발생합니다.

here과 같은 스크립트가 나오기 전에 모든 메타 태그를 이동하려고했습니다. 그것은 아무것도 바뀌지 않았습니다.

XHR 폴링이 작동하지 않는 것 같습니다. 즉, 설정을 변경하는 것에 관한 게시물을 보았습니다. 그러나 분명히 우리 고객이 가서 우리 사이트를 방문하기 위해 브라우저 설정을 변경하도록 IT 부서에 요청할 필요는 없습니다. 그래서 우리는 그 방법을 버렸습니다.

빈 페이지를 만들고 연결하는 중 .. 시도했습니다. 작동합니다. 그러면 무엇이 방해가 될까요?

바라건대 너희들이 뭔가를 가지고 있을까?

답변

0

단순히 Socket.io를 작동시킴으로써이 문제를 해결할 수 없었습니다. 이것이 Socket.io 문제인지 아니면 Angularjs와 Socket.io의 콤보인지는 알 수 없습니다.

그러나 우리는 자체 폴백을 추가하여이 문제를 해결했습니다. 우리의 Socket.io 서비스에서 우리는 ie9 +뿐만 아니라 webkit과 firefox 브라우저에 존재하는 기능의 존재를 확인합니다.

var use_socketIO = true; 

/* 
    I'd like to detect websocket, or jsonp. 
    But those transport methods themselves work. 
    Just not reliably enough to actually use 
*/ 

if (typeof(window.atob) === 'undefined') { 
    console.log('browser appears to be < ie10.'); 
    use_socketIO = false; 
} 

if (use_socketIO) { 
    var socket = io.connect('https://api.ourdomain.com', { 
     'reconnect' : true, 
     'reconnection delay' : 1500 
    }); 
} 

// Fall back http method. 
function httpReq(method, url, data) { 
    var defer = $q.defer(); 

    $http({ 
     method: method, 
     url: '//www.domain.com/api'+url, 
     data: data 
    }).success(function (data, status, headers, config) { 
     defer.resolve(data) 
    }); 

    return defer.promise; 
} 

// Socket.io method. 
function socketReq(method, url, data) { 
    var defer = $q.defer(); 

    socket.emit(method, {url: url, data: data}, function (response) { 
     try { 
      var data = JSON.parse(response); 

      defer.resolve(data); 
     } catch (e) { 
      $log.error('Failed to parse JSON'); 
      $log.info(response); 
      defer.reject(e); 
     } 

    }); 

    return defer.promise; 
} 

// Main Request method 
function request(method, url, data) { 

    if (use_socketIO) { 
     return socketReq(method, url, data || {}); 
    } else { 
     return httpReq(method, url, data || {}); 
    } 
} 

그러면 간단히 request ('get', '/ url')를 호출합니다.

서버 쪽 우리는 req와 res 객체를 빌드하기 위해 Socket.io를 만든 다음 그것을 처리하기 위해 전달하는 마법을 사용합니다. 그렇지 않으면 표현이 정상적으로 처리됩니다.