2016-04-16 11 views
0

Aus einer .net-Welt, in der Synchronizität gegeben ist, kann ich meine Daten aus einer Backend-Quelle wie einer Datenbank, Lucene oder sogar einer anderen API abfragen. Ich habe Probleme, eine gute Probe davon für node.js zu finden, wo async die Norm ist.node.js und hapi: synchrones Abrufen von Daten aus einer Datenbank

Das Problem, das ich habe, ist, dass ein Client einen API-Aufruf zu meinem Hapi-Server macht, und von dort muss ich die Parameter aufnehmen und eine Elasticsearch Abfrage zum Aufruf erstellen, mit der request-Bibliothek, und warten Damit die Instanz zurückkehrt, bevor sie meine Sicht auffüllt und an den Client zurücksendet, ist das Problem, dass die Anforderungsbibliothek einen Rückruf verwendet, sobald die Daten zurückgegeben wurden, und die leere Sicht bis dahin wieder an den Client zurückgegeben wurde.

Der Versuch, die Rückgabe innerhalb des Callbacks zu platzieren, funktioniert nicht, da der EOF für das Javascript bereits getroffen wurde und null zurückgegeben wurde. Was ist der beste Weg, Daten innerhalb eines Serviceaufrufs abzurufen?

EX:

var request = require('request'); 
var options = { 
    url: 'localhost:9200', 
    path: {params}, 
    body: { 
    {params} 
    } 
} 

request.get(options, function(error, response){ 
    // do data manipulation and set view data 
} 

// generate the view and return the view to be sent back to client 
+0

Können Sie uns Ihren Hapi-Code zeigen? –

Antwort

1

Wrap Anfrage Anruf in Ihrem hapi Handler durch Verschachtelung Rückrufe, so dass die Asynchron-Aufgaben in der richtigen Reihenfolge Logik auszuführen. Pseudo hapi Handler-Code ist wie folgt

function (request, reply) { 

    Elasticsearch.query((err, results) => { 

     if (err) { 
      return reply('Error occurred getting info from Elasticsearch') 
     } 

     //data is available for view 


    }); 


} 

Wie ich bereits sagte in Ihrer letzten Frage, Verwendung hapi pre-Handler Sie tun async Aufgaben zu helfen, bevor er zu Ihrem Client antworten. Weitere Informationen finden Sie in der Dokumentation here. Verwenden Sie auch wreck anstelle der Anfrage ist es robuster und einfacher zu verwenden