2017-09-23 3 views
0

Ich habe 2 Funktionen, die erste:machen Asynchron-Anrufe mit NodeJS und Express

router.post('/getStances', function(req, res, next) { 
    var text = '{"success":"0"}'; 
    text = queries.getStances(req.body.issues[0], req.body.issues[1], req.body.issues[2], req.body.issues[3]); 
    var obj = JSON.parse(result); 
    res.send(obj); 
}); 

die zweite:

getStances: function (a, b, c, d) { 
     var sendback = '{"stances":['; 
     sendback += '{"1":['; 
     var querytext = "SELECT * FROM allIssues WHERE topicname = '"+ a +"'"; 
     query = client.query(querytext,function (callback) { 
      query.on('row', (row) => { 
       sendback += "{" + '"'+row['topicstance']+'"' + " : " + '"'+ row['topicdescription'] + '"'+ "} , "; 
       console.log(sendback); 
      }); 
     }); 

     querytext = "SELECT * FROM allIssues WHERE topicname = '"+ b +"'"; 
     query = client.query(querytext); 
      query.on('row', (row) => { 
       sendback += "{" + '"'+ row['topicstance'] + '"'+ " : " + '"'+ row['topicdescription'] + '"'+ "} , "; 
      }); 
      query.on('end',() => { 
       sendback += "]}"; 
       sendback += "]}"; 
       client.end(); 
       return sendback; 
      }); 
     } 

Die erste Funktion durch die Client-Anwendung aufgerufen wird, dann ruft getStances die macht DB-Aufrufe und sollte einen JSON-String zurückgeben, der alle db-Informationen enthält, aber wenn text = getStances() aufgerufen wird, text auf undefined gesetzt ist und der Rest der Router-Funktion ausgeführt wird, versucht er text zu JSON zu analysieren, aber seit seine undefined, es funktioniert nicht. Wie mache ich den Router asynchron, so dass er auf text = getStances() wartet, bevor er mit dem Rest des Codes fortfährt? Ich habe versucht Callbacks und Versprechungen, aber ich bekomme mehr oder weniger die gleichen Ergebnisse, ich bin mir nicht sicher, wie genau sie funktionieren, vielleicht habe ich sie falsch benutzt. Kann jemand Beispiele geben, wie ich das beheben könnte?

+0

Überprüfen Sie die Dokumentation für 'client.query()', sollte das erste Argument des Callbacks nicht ein Error-Objekt sein? Und baue deine JSON-Zeichenkette nicht mit Zeichenketten - es ist hässlich; Benutze einfach ein Objekt. Wenn Sie ein Objekt als Antwort senden, wird es in ein JSON-Objekt konvertiert. – Mikey

Antwort

1

getStances() benötigt einen Weg, um anzuzeigen, dass es fertig ist - ein Rückruf oder Versprechen.

Ihre Funktion Signatur könnte wie folgt aussehen:

let i = req.body.issues // for brevity 
text = queries.getStances(i[0], i[1], i[2], i[3], function(err, result){ 
    if (err) return console.log("error: ", err) 
    var obj = JSON.parse(result); 
    res.send(obj); 
); 

Dies ist ein grundlegendes Knotenmuster:

getStances: function (a, b, c, d, callback) { 
    someAsynFunction(arg, function(err, result){ 
     if (err) return callback(err) // errors go first by convention 
     callback(null, results) // callback(error, result) 
    } 
} 

Dann sind Sie es, indem man eine Funktion in getStances() für den Rückruf verwenden können.

Es ist nicht klar, welchen DB-Client Sie verwenden, aber ich vermute, dass Sie ein anderes Problem in Ihrem Code haben.

Es sieht so aus, als würden Sie zwei asynchrone Anrufe in getStances() machen und Sie zählen auf den ersten vor dem zweiten. Dies ist wahrscheinlich zu brechen, so müssen Sie herausfinden, wie Ihr Client kommuniziert, dass es fertig ist (gibt es eine query.on('finished') oder ähnliches?), Wenn Sie sicherstellen möchten, dass sie nacheinander auftreten.