2015-06-08 3 views
4

Я застрял на том, почему приложение node.js, перенесенное на сервер IIS7 теперь терпит неудачу. Я знаю, что IIS7 не поддерживает веб-сокеты, но я понимаю, что socket.io вернется к длинному опросу, если веб-сокет недоступен. Так что теперь, когда пользователь пытается нажать специальную кнопку, которая, как правило, имеют необходимый сокет или длинный опрос я получаю что-то вроде этого:Node.js с Socket.io - Long Polling терпит неудачу и выдает «код»: 1, «сообщение»: «Неизвестный сеанс» ответ

XHR finished loading: POST "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777964357-6&sid=QWsESi0c9ih7WMWKAAAC". 
GET https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC 400 (Bad Request) 
XHR finished loading: GET "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC". 
OPTIONS https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC 
XMLHttpRequest cannot load https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC. Invalid HTTP status code 400 

Когда я нажимаю на GET или XMLHttpRequest я могу видеть, что ответ "code":1,"message":"Session ID unknown", который я не понимаю, так как вижу SID. Когда я нажимаю на коде, перечисленных в провале для варианта я вижу, что проблема исходит от Request.prototype.create, а именно XHR посыла:

xhr.send(this.data); 

Кто-нибудь есть какие-либо идеи, что может быть причиной их вещи?

Любые разъяснения были бы весьма признательны!

Большое вам спасибо!

ответ

0

была такая же ошибка в последнее время с Socket.io: {"code":1,"message":"Session ID unknown"} для веб-сокетов соединение, хотя настройка отличается (nginx + пассажир + nodejs). Проблема была нарушена соединение от NodeJS к Redis, которое у меня есть в приложении NodeJS. Поэтому, когда Redis был правильно запущен (это проблема с привязкой IP-адресов), socket.io начал правильно связываться через веб-сокеты. Если вы застряли на одной и те же проблемы, убедитесь, что ваше NodeJs приложение работает должным образом (например, он соединяется со всеми необходимыми ресурсами)

3

В моем проекте я попытался добавить опцию transport как websocket и ошибка больше не появляется.

io.connect(url, { 
    "transports": ['websocket'] 
}) 

Это будет проблема с поддерживающей IE и других старых браузерах, поскольку они не поддерживают родные WebSockets, если совместимость браузера приложение не является проблемой, это, кажется, решение.

+1

У меня был этот вопрос в хроме. изо всех сил пытался исправить это в течение последнего дня. Большое спасибо за ваше решение. – undefined

1

Для Socket.io v2.0.3 (JS клиент), при использовании socket.io на стороне клиента, клиент socket.io делает некоторые сетевые вызовы, как объяснено:

  1. Когда io.connect() вызвана, socket.io библиотека делает вызов к серверу, который выглядит как

    ?EIO=3&transport=polling&t=LqtOnHh,

    сервер отвечает что-то вроде

    "90:0{"sid":"pcJM_AEZirrJT-DuAAUy","upgrades[], "pingInterval":3600000,"pingTimeout":3600000}2:40"

    здесь сервер генерирует объект сокета на стороне сервера и отправляет его идентификатор обратно клиенту.

  2. После этого клиент делает еще один вызов на сервер, который является чем-то вроде

    ?EIO=3&transport=polling&t=LqtR6Rn&sid=0JFGcEFNdrS-XBZeAAXM

    это длинный опрос вызов, который клиент делает на сервере, если вы видите, здесь проходит в SESSIONID, который он был получен в первом вызове выше, если вызов переходит на тот же узел, который сгенерировал этот sessionId, узел идентифицирует соединение сокета, для которого был выполнен запрос, и отвечает.

    Но за ELB вызов может идти в какой-то другой узел, который не генерирует этот sessioId, в этом случае узел не сможет определить SESSIONID, для которого был сделан вызов, и, следовательно, отвечает {"code":1,"message":"Session ID unknown"}

Вы также увидите эту ошибку в случае длительного опроса, не получившего ответа или получения таймаута.

0

для меня, это было с Nginx http2 SSL, и это был опрос, так что хороший конфиг является:

const ioSocket = io('', { 
     // Send auth token on connection, you will need to DI the Auth service above 
     // 'query': 'token=' + Auth.getToken() 
     path: '/socket.io', 
     transports: ['websocket'], 
     secure: true, 
    });