2016-04-26 18 views
0

Ich bin neu in Nodejs und Jquery, und ich versuche, ein einzelnes HTML-Objekt mit einem Skript zu aktualisieren. Ich benutze einen Raspberry Pi 2 und einen Ultraschallsensor, um die Entfernung zu messen. Ich möchte kontinuierlich messen und das HTML-Dokument gleichzeitig mit den Echtzeitwerten aktualisieren.Update HTML-Objekt mit node.js und Javascript

Wenn ich versuche, meinen Code auszuführen, verhält es sich wie ein Server und kein Client. Alles, was ich console.log() drucke, wird in cmd und nicht in der Konsole des Browsers ausgegeben. Wenn ich meinen Code jetzt starte, mache ich das mit "sudo node surveyor.js", aber nichts passiert im HTML-Dokument. Ich habe es richtig mit dem Skript verknüpft. Ich habe auch document.getElementsByTagName ("h6") versucht. InnerHTML = distance.toFixed (2), aber der Fehler ist "Dokument ist nicht definiert".

Gibt es einen einfachen Weg, dies zu beheben?

Mein Code so weit ist:

var statistics = require('math-statistics'); 
var usonic = require('r-pi-usonic'); 
var fs = require("fs"); 
var path = require("path"); 
var jsdom = require("jsdom"); 

var htmlSource = fs.readFileSync("../index.html", "utf8"); 



var init = function(config) { 
    usonic.init(function (error) { 
     if (error) { 
     console.log('error'); 
     } else { 
      var sensor = usonic.createSensor(config.echoPin, config.triggerPin, config.timeout); 
      //console.log(config); 
      var distances; 

      (function measure() { 
       if (!distances || distances.length === config.rate) { 
        if (distances) { 
         print(distances); 
        } 

        distances = []; 
       } 

       setTimeout(function() { 
        distances.push(sensor()); 

        measure(); 
       }, config.delay); 
      }()); 
     } 
    }); 
}; 

var print = function(distances) { 
    var distance = statistics.median(distances); 

    process.stdout.clearLine(); 
    process.stdout.cursorTo(0); 

    if (distance < 0) { 
     process.stdout.write('Error: Measurement timeout.\n'); 
    } else { 
     process.stdout.write('Distance: ' + distance.toFixed(2) + ' cm'); 

     call_jsdom(htmlSource, function (window) { 
      var $ = window.$; 
      $("h6").replaceWith(distance.toFixed(2)); 
      console.log(documentToSource(window.document)); 
}); 

    } 
}; 


function documentToSource(doc) { 
    // The non-standard window.document.outerHTML also exists, 
    // but currently does not preserve source code structure as well 

    // The following two operations are non-standard 
    return doc.doctype.toString()+doc.innerHTML; 
} 

function call_jsdom(source, callback) { 
    jsdom.env(
     source, 
     [ 'jquery-1.7.1.min.js' ], 
     function(errors, window) { 
      process.nextTick(
       function() { 
        if (errors) { 
         throw new Error("There were errors: "+errors); 
        } 
        callback(window); 
       } 
      ); 
     } 
    ); 
} 

init({ 
    echoPin: 15, //Echo pin 
    triggerPin: 14, //Trigger pin 
    timeout: 1000, //Measurement timeout in µs 
    delay: 60, //Measurement delay in ms 
    rate: 5 //Measurements per sample 
}); 
+0

Ich verstehe nicht wirklich, warum Sie node.js dafür verwenden ... – frankenapps

+1

Ich schlage vor, Ihr Programm in logische Stücke zu trennen, und dann stellen Sie Ihre Frage zu dem bestimmten Teil, mit dem Sie Hilfe brauchen. Sie werden sicherlich eine bessere Antwort bekommen! – Dave

Antwort

0

Node.js ist eine serverseitige Implementierung von JavaScript. Es ist in Ordnung, alle Sensorenoperationen und Berechnungen auf der Serverseite auszuführen, aber Sie benötigen einen Mechanismus, um die Ergebnisse Ihren Clients zur Verfügung zu stellen. Wenn sie Ihre Anwendung mithilfe eines Webbrowsers verwenden möchten, müssen Sie einen HTTP-Server wie Express.js ausführen und eine Route (etwa http://localhost/surveyor oder nur http://localhost/) erstellen, die eine Methode aufruft, die Sie auf der Serverseite implementiert haben, und etwas tun mit dem Ergebnis. Eine Möglichkeit, diese resultierenden Daten an die Clients zurückzugeben, ist das Rendern einer HTML-Seite, die sie anzeigt. Dafür sollten Sie eine Template Engine verwenden.

sollte All DOM-Manipulation auf Client-Seite durchgeführt werden (man könnte zum Beispiel eines <script>-Tages in Ihrer Vorlage in HTML ist einfach zu versuchen und zu verstehen, wie es funktioniert, aber es ist dies nicht empfohlen in der Produktion zu tun Umgebungen).

Versuchen Sie Google für Node.js Beispiele und Tutorials suchen und Sie erhalten es :)