2017-06-09 9 views
0

Ich arbeite an einer sehr einfachen Webanwendung, die nicht viel tut, aber es verbindet sich mit einer Datenbank für INSERT und SELECT-Operationen auf einer Tabelle. Ich habe eine Funktion, die ich beim Browsen durch mehrere große Tutorials verwendet habe, aber ich habe Schwierigkeiten, die rows aus der SELECT-Abfrage zurückzugeben. In Erinnerung, ich lerne Node.JS - wie würde ich die Daten aus der Abfrage (SELECT) an diesen Block anzeigen?Rückgabewert von innerer Funktion einer Funktion node.js/MySQL

app.post("/getcsv", function(req,res){ 

var sqlselall = "SELECT * FROM office"; 
var rows = handle_database(sqlselall); 
res.json(rows); 
res.end(); 

Die Funktion der Datenbankverbindungen (mit Pooling) für die Handhabung:

function handle_database(sqlstmt){ 

pool.getConnection(function(err,connection){ 

    if(err) { 
     res.json({"code" : 100, "status" : "Error in connection to database."}); 
     return; 
    } 

    console.log('connected as id ' + connection.threadId); 

    connection.query(sqlstmt, function(err,rows){ 
     connection.release(); 
     if(!err){ 
      console.log("Number of rows affected: " + rows.affectedRows); 
     } 

    }); 

    connection.on('error', function(err) { 
     res.json({"code": 100, "status" : "Error in connection to database."}); 
     return; 
    }); 

ich, dass die rows in der inneren Funktion erkennen die Daten enthalten, ich brauche, aber ich bin ratlos, wie zu wie man es zurückgibt, wenn ich die Funktion rufe.

+0

Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-a-asynchronous- Ruf) – Paul

+0

@Paul - leider habe ich Probleme, das Konzept der Rückrufe in JS vollständig zu begreifen. – Smitty

+0

es ist nur etwas, was Sie durch einige Tutorials auf durchlaufen müssen. Callbacks sind nur Funktionen, aber das Fleisch, das Sie möchten (z. B. die Zeilen), ist nur innerhalb dieser Funktion beschränkt. Sie müssen also sicherstellen, dass alles, was Sie benötigen, im selben Umfang verfügbar ist. – Paul

Antwort

0

Beantwortung meiner Frage, besonders wenn man bedenkt einige ist es ein Duplikat betrachten kann (was aufgrund meiner Unkenntnis in Bezug auf Node.JS und JS im Allgemeinen wahrscheinlich ist), ungeeignet scheint jedoch entdeckte ich, dass ich einmal habe einige Nachforschungen (Danke @Paul - und Callback-Hell) und Klärung einiger Grundlagen bezüglich Funktionen, Callbacks, anonymer Funktionen und der Art des Funktionsumfangs in Javascript Ich konnte mir eine Lösung für mein Problem einfallen lassen. Also für meine Verbindung zum DB habe ich eine neue vereinfachte Funktion, die übergeben wird, die Parameter ‚res‘ aus dem Callback-Parameter (die ich jetzt etwas verstehen) von app.post:

app.post("/getcsv", function(req, res) { 

    var sqlselall = "SELECT * FROM office" 
    var thisData = select_query(sqlselall, res) 
}) 

function select_query(sqlstmt, res) { 

    pool.query(sqlstmt, function(err, results, fields) { 
    if (err) throw err 
    res.send(JSON.stringify(results)) 
    }) 
} 
1

Also, wenn ich könnte habe dich kommentiert antworte ich hätte. Dies ist etwas, das ich gerne zu Ihrer Antwort hinzufügen würde, weil es so aussieht, als ob Ihre Antwort zu mir funktionieren sollte, obwohl ich es nicht persönlich getestet habe.

Aus der Erfahrung zu versuchen, den Callback-Stil zu lernen, denke ich, dass dies Ihnen helfen könnte. Es hilft dabei, den Code etwas modularer zu halten.

app.post("/getcsv", function(req, res) { 
    var sqlselall = "SELECT * FROM office" 
    select_query(sqlselall, function(results){ 
     res.send(results) 
    }) 
}) 

function select_query(sqlstmt, callback) { 
    pool.query(sqlstmt, function(err, results, fields) { 
    //I suppose if this is how you want to handle errors 
    //for debugging purposes I like returning them as well 
    //returning it helps both you and others who might be working on 
    //the front end to know whats happening 
    if (err) throw err 
    callback(JSON.stringify(results)) 
    }) 
} 

Auf diese Weise Ihre select_query Funktion nicht die res erfordern übergeben zu bekommen, und verlässt sich nicht auf einen Parameter, der eine Funktion, um zu arbeiten hat. Manchmal kann das nicht geholfen werden, aber wenn es für mich einfacher ist, Wartung dies zu berücksichtigen. In der hypothetischen Situation, dass Sie möglicherweise einen anderen Endpunkt haben, der ebenfalls abgefragt werden muss, aber die Information vor dem Senden anhängen muss, können Sie trotzdem die select_query-Funktion verwenden und nur Ihren Callback ändern dass du daran teilnimmst. Also würden Sie mit etwas so enden: (Ich habe auch den Fehler ein wenig Handling)

app.post("/getcsv", function(req, res) { 
    var sqlselall = "SELECT * FROM office" 
    select_query(sqlselall, function(err, results){ 
     if(err){ 
     res.send(err) 
     //throw an error if you would like to here 
     } 
     res.send(results) 
    }) 
}) 
app.post("/modifyCSV", function(req, res){ 
    var sql = "{sql statement}" 
    select_query(sql, function(err, results){ 
    if(err){ 
     res.send("Aww an error: "+err) 
     //throw an error if you would like to here 
    }res.send(reuslts + "\nHello to you too") 
    }) 
}) 

function select_query(sqlstmt, callback) { 
    pool.query(sqlstmt, function(err, results, fields) { 
    if (err) 
    callback(JSON.stringify(err), null) 
    callback(null, JSON.stringify(results)) 
    }) 
} 

Wie ich schon sagte, ich sage nicht, Ihren Weg falsch ist, es funktioniert, und vielleicht wird es besser für Sie. Ich habe gerade festgestellt, dass dies mir geholfen hat, Callbacks in den Griff zu bekommen, und tatsächlich anfangen, sie zu genießen.

+0

Vielen Dank dafür! Ihr erstes Codebeispiel hat tatsächlich dazu beigetragen, das Konzept eines Callback-Homes ein wenig mehr zurückzubringen. Sie können also eine anonyme Funktion als Parameter übergeben, der der Callback-Funktion innerhalb der benannten Funktion entspricht, die Sie aufrufen. Aus logischer Sicht kein leicht zu erfassendes Konzept - vor allem aus C#. – Smitty

+0

Richtig, es ist wie ein anderes Paradigma, aber ich genieße es wirklich. Ich bin froh, dass es geholfen hat. – Jeff