2017-01-23 1 views
0

у меня есть этот простой кусок кода в файл яваскрипт server.js обслуживаемого узла:Передачи данных в таймере с помощью JS WebRTC аварий при перегрузке до конца

function multiStep(myConnection, data) { 
    var i=0; 
     var myTimer=setInterval(function() { 
     if (i<data.length){ 
      var element=JSON.stringify(data[i]); 
      console.log("mando elemento: "+element); 
      myConnection.send(element); 
      i++; 
     } 
    }, 3000); 
} 

//require our websocket library 
clearInterval(myTimer); 
var WebSocketServer = require('ws').Server; 
//creating a websocket server at port 9090 
var wss = new WebSocketServer({port: 9090}); 

//when a user connects to our sever 
wss.on('connection', function(connection) { 

    loadJSON(function(response) { 

//when server gets a message from a connected user 
     connection.on('message', function(message){ 
       console.log("Got message from a user:", message); 
     }); 
     var json = JSON.parse(response); 
     multiStep(connection, json, 0); 
    }) 
}); 

loadJSON просто загружает файл в формате JSON данных из другой веб-сайт. Когда я запускаю клиентское приложение в первый раз или когда тайм-аут закончился, все идет хорошо. Тем не менее, если я перезагрузить страницу в то время как тайм-аут не закончил я получаю сбой при попытке использовать соединение старой страницы на сервере с докладом:

/var/www/html/MATERIALI/phonegap/node_modules/ws/lib/WebSocket.js:219 else throw new Error('not opened'); ^Error: not opened at WebSocket.send (/var/www/html/MATERIALI/phonegap/node_modules/ws/lib/WebSocket.js:219:16) at null. (/var/www/html/MATERIALI/phonegap/WebRTC/server.js:36:9) at wrapper [as _onTimeout] (timers.js:261:14) at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

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

ответ

1

Хорошо, я думаю, я нашел решение; функция multiStep будет:

function multiStep(myConnection, data) { 
    var i=0; 
    clearInterval(myTimer); 
    myTimer=setInterval(function() { 
      if (i<data.length){ 
       var element=JSON.stringify(data[i]); 
       console.log("mando elemento: "+element); 
       try { 
        myConnection.send(element); 
        console.log("mandato elemento"); 
       } catch(err) { 
        console.log('Websocket error: %s', err); 
      } 
      i++; 
     } else { 
     } 
    }, 3000); 
} 

И он больше не разбивается.

+0

Учитывая, что я помог вам дойти до этого момента, вы могли бы поддержать мой ответ, пожалуйста? – Mikkel

+0

Ответ вы на самом деле не очень полезны, если вы не повышаете меня, что такое comamnd, чтобы проверить достоверность консенсуса ...Я afarid Я должен был найти решение сам, чтобы избежать аварии. –

0

Вам необходимо сделать некоторые проверки в пути. Ваш код предполагает, что все на 100%.

var json = JSON.parse(response); 
multiStep(connection, json, 0); 
  1. Вы предполагаете, есть данные в ответ (он может быть пустым или содержать данные, не JSon)
  2. Вы должны также проверить, что JSON является действительным массивом перед передачей его в многошаговых
  3. функция MultiStep также предполагает, что data.length будет возвращать что-то числовое

Это не может быть полный ответ, но это должно дать вам начать сделать ваш код более надежным.

Это, вероятно, провал в myConnection.send(element);, но это, вероятно, лишь симптом вашего отсутствия проверки по пути (вы также можете проверить, если MyConnection еще действует, прежде чем отправить что-нибудь к нему)

Ссылаясь на https://developer.mozilla.org/en-US/docs/Web/API/WebSocket, вы должны быть в состоянии проверить myConnection.readyState значение:

Готовые константы состояния

Эти константы используются readyState атрибут для описания состояния соединения WebSocket.

Constant Value Description 
CONNECTING 0 The connection is not yet open. 
OPEN 1 The connection is open and ready to communicate. 
CLOSING 2 The connection is in the process of closing. 
CLOSED 3 The connection is closed or couldn't be opened. 

Ваш код будет выглядеть, как это сейчас:

console.log("mando elemento: "+element); 
    if (myConnection.readyState === 1) 
      myConnection.send(element); 
    else 
      console.log("web socket not open"); 
+0

Проблема не в данных Json. Скорее, как вы намекали в конце вашего сообщения, действительность myConnection. Как это проверить, чтобы избежать вызова команды send на unvalid-соединении? –

+0

Добавлено больше ответа для вас, вероятно, вы должны его проверить, и только если он ОТКРЫТ, вы должны попытаться отправить данные – Mikkel

+0

Проблема в том, что я не знаю, как проверить, открыто ли соединение, и вы не ответили мой вопрос тоже. –

Смежные вопросы