2016-08-10 7 views
1

Ich habe einen NodeJS Server, der JSON von drei Webseiten nimmt und es sendet, um auf meiner Website (in JSON) angezeigt zu werden. Der JSON auf den Webseiten, von denen ich ausgehe, wird ständig alle 10 Sekunden aktualisiert. Wie kann ich meinen NodeJS-Server ständig aktualisieren, sodass er die aktuellsten Daten enthält?Wie man einen Nodejs Server asynchron macht

Ich nehme an, das ist nicht möglich, ohne die Seite zu aktualisieren, aber es wäre optimal, wenn die Seite nicht aktualisiert wurde.

Wenn dies mit NodeJS nicht möglich ist und es eine andere Methode gibt, dies zu erreichen, wäre ich sehr dankbar, wenn Sie es mir sagen würden.

Code:

router.get("/", function(req, res){ 
var request = require('request-promise'); 
var data1; 
var data2; 
var data3; 

request("website1.json").then(function(body){ 
    data1 = JSON.parse(body); 

    return request("website2.json"); 
}) 
    .then(function(body) { 
     data2 = JSON.parse(body); 


     return request("website3.json"); 
    }) 
    .then(function(body){ 
     data3 = JSON.parse(body); 

     res.render("app.ejs", {data1: data1, data2: data2, data3: data3}); 
    }) 
}); 
+3

Können Sie den Service, den Sie von der einrichten nicht abfragen Client über js Ajax/Comet Anrufe? Sie könnten auch in ein Framework wie Meteor schauen. Oder richten Sie es selbst über Websockets ein - siehe Tutorials auf socket.io und ähnlichem. – ldg

+0

Asynchron und Aktualisieren einer Seite ohne Aktualisierung sind zwei sehr unterschiedliche und separate Konzepte.Sie haben auch zwei Möglichkeiten, eine Seite ohne Aktualisierung zu aktualisieren. Erstens, den Server überhaupt nicht zu modifizieren, stattdessen den HTML/JavaScript-Code im Browser zu ändern, um regelmäßig neue Daten zu holen (alle 10 Sekunden?). Zweitens, Ändern des Servers, um Push-Benachrichtigungen über kometähnliche Techniken oder Websockets zu verwenden. – slebetman

Antwort

3

Hier einige allgemeine Richtlinien:

  1. Untersuchen Sie die APIs, die Sie von Ihrem externen Dienst zur Verfügung haben. Finden Sie heraus, ob es etwas gibt, mit dem Sie eine webSocket-Verbindung oder eine andere kontinuierliche TCP-Verbindung herstellen können, sodass Sie Echtzeit- (oder nahezu Echtzeit-) Benachrichtigungen erhalten, wenn sich die Dinge ändern. Wenn ja, lass deinen Server das verwenden.

  2. Wenn es keine Echtzeitbenachrichtigungs-API vom externen Server gibt, müssen Sie sie alle xx Sekunden abfragen. Um zu entscheiden, wie oft Sie den Fragebogen abfragen sollten, müssen Sie Folgendes berücksichtigen: a) Wie oft Sie wirklich neue Daten in Ihren Webseiten benötigen (z. B. Daten, die innerhalb von 5 Minuten aktuell sind), b) Was sind die Nutzungsbedingungen? und rate limiting sind für den 3rd-Party-Service (zB wie oft lässt man sie abfragen) und c) wie viel sich Ihr Server leisten kann, um ihn abzufragen (aus Sicht des Server-Load).

  3. Sobald Sie herausgefunden haben, wie oft Sie den externen Dienst abfragen, erstellen Sie sich einen wiederkehrenden Abfragemechanismus. Der einfachste Weg wäre die Verwendung von setInterval(), die für die Abfrageintervallzeit eingestellt ist. Ich habe einen Raspberry Pi node.js Server, der eine setInterval() verwendet, um mehrere Temperatursensoren wiederholt zu überprüfen. Dieser Mechanismus funktioniert gut, solange Sie eine geeignete Intervallzeit für Ihre Situation auswählen.

  4. Dann für die Kommunikation von neuen Informationen zurück zu einer angeschlossenen Webseite, der beste Weg, um "Echtzeit" Updates vom Server zu erhalten, ist für die Webseite eine webSocket oder socket.io Verbindung zu Ihrem Server zu machen. Dies ist eine ständig verbundene Steckdose, über die Nachrichten in beide Richtungen gesendet werden können. Wenn Sie diesen Mechanismus verwenden, stellt der Client eine socket.io-Verbindung zu Ihrem Server her. Der Server empfängt diese Verbindung und die Verbindung bleibt für die gesamte Lebensdauer dieser Webseite geöffnet. Wenn Ihr Server dann über neue Daten verfügt, die an diese Webseite gesendet werden müssen, kann er einfach eine Nachricht über diese socket.io-Verbindung senden. Die Webseite empfängt diese Nachricht und kann dann den Inhalt der Webseite basierend auf den Daten in der Nachricht entsprechend aktualisieren. Keine Seitenaktualisierung ist erforderlich.

Hier eine übersicht der Code-Server:

// start up socket.io listener using your existing web server 
var io = require('socket.io')(app); 

// recurring interval to poll several external web sites. 
setInterval(function() { 
    var results = {}; 
    request("website1.json").then(function (body) { 
     results.data1 = JSON.parse(body); 
     return request("website2.json"); 
    }).then(function (body) { 
     results.data2 = JSON.parse(body); 
     return request("website3.json"); 
    }).then(function (body) { 
     results.data3 = JSON.parse(body); 
     // decide if anything has actually changed on external service data 
     // and whether anything needs to be sent to connected clients 
     io.emit("newData", results); 
    }).catch(function(err) { 
     // decide what to do if external service causes an error 
    }); 
}, 10000); 

Der Client-Code dann wie dies in der Regel wäre:

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io(); 
    socket.on("newData", function(data) { 
     // process new data here and update the web page 
    }); 
</script> 
+0

Also, wenn ich richtig verstehe, da die APIs, auf die ich zugreife, keine webSocket-Verbindungen haben, erstellt socket.io eine für mich? Das war ein sehr aufschlussreicher Beitrag, vielen Dank !! – CtrlAltDelete

+0

@saltyalty - Nein, das ist es nicht. Eine socket.io-Verbindung benötigt webSocket-Unterstützung und kann nur mit einem Server verbunden werden, der socket.io unterstützt. Also, wenn die API, die Sie haben, nicht webSocket oder socket.io Unterstützung eingebaut hat, dann ist das einzige, was Sie tun können, um es abzufragen. Sie können socket.io jedoch zwischen Ihrer Webseite und Ihrem eigenen Server verwenden, da Sie beide Enden kontrollieren, so dass Sie an beiden Enden socket.io-Unterstützung hinzufügen können. – jfriend00

+0

Ich sehe. Da ich keinen Zugriff auf die API habe, um einen webSocket zu erstellen, wie würde ich ihn abfragen? – CtrlAltDelete

Verwandte Themen