2016-09-27 11 views
0

Я новичок в node.js (или вообще javascript) и не уверен, что здесь происходит. Иногда, когда я запускаю свой сервер node.js, сразу же, когда он запускается, он начинает печатать данные с последнего запуска. Есть ли что-то, что может удержать все от перезагрузки при новом запуске? У меня есть arduino XBee узлы, подключающиеся к этому серверу. Вот мой node.js код:node.js сервер не всегда очищает данные из предыдущего запуска

var SerialPort = require("serialport"); 
var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var ON_DEATH = require('death'); 

// Set up serial port 
var portName = process.argv[2], 
portConfig = { 
    baudRate: 9600, 
    parser: SerialPort.parsers.readline("\n") 
}; 
var sp = new SerialPort(portName, portConfig); // got rid of deprecation issue with sp4 

// Respond with file when a GET request is made to the homepage: app.METHOD(PATH, HANDLER) '/'=homepage 
app.get('/', function(req, res){ 
    res.sendfile('index.html'); 
});    

// Listen on the connection event for incoming sockets, and log it to the console. 
io.on('connection', function(socket){ 
    console.log('a user connected'); 
    socket.on('disconnect', function(){ 
    }); 
    socket.on('chat message', function(msg){ 
     io.emit('chat message', msg); 
     sp.write(msg + "\n"); 
    }); 
}); 

// Make the http server listen on port 3000 
http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 

///////////////////////////////////////////////////////////////////////////////////////////////// 

sp.on("open", function (err) { 
    if (err) 
     return console.log('Error opening port: ', err.message); 
    console.log('open'); 

    // INFO VARIABLES 
    //var nodeCount = 0; 
    var pendingNodes = []; 
    var connectedNodes = []; 
    var buffer0; 
    var nodeInfo; 

    // Cleanup when termination signals are sent to process 
    ON_DEATH(function(signal, err) { 
     var death_msg = "Q"; 
     sp.write(death_msg); 
     sp.close();  
     // zero out all variables 
     pendingNodes = []; 
     connectedNodes = []; 
     buffer0 = []; 
     nodeInfo = []; 

     console.log("\n\nSending reset signal to nodes.\n\n") 
     sp.flush(function(err,results){}); 
     process.exit(); 
    }) 

    // listen for data, grab time, delimit 
    sp.on('data', function(data) { 
    var time = new Date(); 
    buffer0 = data.split('\n'); // array of data till newline 
    // Split again into either "#ID" into [#ID] (if new broadcast), or "#ID Data" into [#ID, Data] (preconnected node) 
    nodeInfo = buffer0[0].split(' '); 
    //console.log("  nodeInfo: " + nodeInfo); 

    // DEBUGGING PRINT -- DELETE LATER 
    //console.log("  pendingNodes: " + pendingNodes + "  connectedNodes: " + connectedNodes); 


//////////////////////////////////////////////////////////////////////////////////////////////////////////// 

    // Receiving ID or [ID, Data] -- Testing all possible cases 

    // if first char 
    if (nodeInfo[0][0] == "#") { // could check up here for && no temp data too 

     // Brand new node (ID not in pendingNodes or connectedNodes) 
     if ((pendingNodes.indexOf(nodeInfo[0]) == -1) && (connectedNodes.indexOf(nodeInfo[0]) == -1)) { 
      console.log("Brand new node: " + nodeInfo[0]) 
      pendingNodes.push(nodeInfo[0]); 

     } 


     // Pending node (ID in pendingNodes, but not in connectedNodes) 
     else if ((pendingNodes.indexOf(nodeInfo[0]) != -1) && ((connectedNodes.indexOf(nodeInfo[0]) == -1))) { 
      console.log(" Pending node: " + nodeInfo[0]) 

      // send back ID to confirm handshake 
      sp.write(nodeInfo[0]); 
      // Remove from pendingNodes 
      var index = pendingNodes.indexOf(nodeInfo[0]); 
      if (index > -1) { 
       pendingNodes.splice(index, 1); 
      } 
      // Add to connectedNodes 
      //var 
      connectedNodes.push(nodeInfo[0]); 


     } 
     // Connected node (ID in connectedNodes, but not in pendingNodes) 
     else if ((pendingNodes.indexOf(nodeInfo[0]) == -1) && (connectedNodes.indexOf(nodeInfo[0]) != -1)) { 
      console.log(" Connected node: " + nodeInfo[0] + " " + nodeInfo[1]); 

      // Disconnect nodes with undefined temperatures to force restart 
      if (typeof nodeInfo[1] == 'undefined') { 
       console.log("Undefined data for node: " + nodeInfo[0] + ". Dropping connection to this node."); 
       var index = connectedNodes.indexOf(nodeInfo[0]); 
       if (index > -1) { 
        connectedNodes.splice(index, 1); 
       } 

      } 

      //var t = time.getTime(); 

      // FIRST: fix bug -- sometimes temp showing as undefined    
      // Then: 
      // Update data properly 
      // Average data 
      // add 3rd element to nodes for time stamp, check that all timestamps are recent periodically 
      // Detect drop-offs and remove nodes 

     } 
     // Error (ID in both pendingNodes and connectedNodes [should not happen]) 
     else { 
      console.log("Error: node exists in both pending and connected.") 

     } 


    } 
    else if (nodeInfo[0][0] != "#") { 
     // FOR DEBUGGING PURPOSES, DELETE LATER 
     console.log("Error 2: incoming data does not start with '#'.") 
    } 



    /* // placeholders for functionality to add 
    var CalcAverage = function() { 
     console.log("CalcAverage: * every 1 second(s) *"); 
    } 
    setInterval(function(){ CalcAverage() },2000); 


    var CheckNodes = function() { 
     console.log("CheckNodes: * every 6 second(s) *"); 
    } 
    setInterval(function(){ CheckNodes() },6000); 
    */ 



    }); // end data 
}); // end open 

А вот пример старых данных узлов появляется как-то:

enter image description here

+0

Пожалуйста, отредактируйте сообщение, чтобы [содержать только минимальный код, который вам нужен] (http://stackoverflow.com/help/mcve), чтобы воспроизвести вашу проблему; сложно найти 150 строк кода, чтобы найти проблему, если вы точно не знаете, в чем проблема ... – Frxstrem

+0

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

ответ

0

Некоторые возможности:

Старый (или новые данные, которые вы Бесполезный он не знает, что он отправлен) данные от клиентов буферизованы каким-то образом на последовательном порту, или socket.io автоматически подключается к клиентским браузерам и начинает отправлять данные, даже если вы не взаимодействовали с веб-страницей браузера клиента.

+0

Есть ли способ очистить все буферизованные данные при запуске сервера? Я пробовал делать 'sp.flush()', но я не думаю, что это сработало. – Austin

+0

Я думаю, попробую определить, связано ли это с узлом. Если это буферизованные последовательные данные, вы можете каким-то образом проверить какой-либо другой последовательный клиент, и если это так, то это не имеет ничего общего с узлом, поэтому вы можете искать какую-то утилиту Linux или скрипт для этого. Вы можете отключить либо материал браузера, либо последовательный порт для тестирования по одному (а также проверить один клиент за раз). –

+0

Я думаю, что когда я делаю 'buffer = data.split ('\ n');', данные имеют старые данные последовательного порта. Есть ли команда javascript, чтобы очистить последовательный буфер сначала, прежде чем смотреть на данные? – Austin

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

  • Нет связанных вопросов^_^