Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Node JS Asynchrone Datenbankaufrufe

Sie geben result zurück und Schließen der Verbindung, bevor die Abfrage ihren Wert von der Datenbank zurückgegeben hat. Fügen Sie diesen Code in den Rückruf ein.

Wenn Sie Ihren Code reparieren, sollte er so aussehen:

function callDatabase(id) {
    var result;
    var connection = mysql.createConnection(
        {
            host        :   '192.168.1.14',
            user        :   'root',
            password    :   '',
            database    :   'test'
        }
    );

    connection.connect();
    var queryString = 'SELECT name FROM test WHERE id = 1';

    connection.query(queryString, function(err, rows, fields) {
        if (err) throw err;

        for (var i in rows) {
            result = rows[i].name;
        }

        connection.end();
        return result;
    });
}

Dies löst jedoch nur einen Teil des Problems, da Sie jetzt immer noch response.end(callDatabase(id)); aufrufen bevor auf eine Antwort von der Abfrage gewartet wird.

Um dies zu beheben, müssen Sie eine Art Rückruf zurücksenden.

function callDatabase(id, callback) {
    // the method code here...
    connection.query(queryString, function(err, rows, fields) {
        // code...

        // instead of returning the result, invoke the callback!
        callback(rows);
    });
}

Jetzt können Sie es so nennen:

request.on('data', function (chunk) {
    var json = JSON.parse(chunk);
    var id = parseInt(json["id"]);
    callDatabase(id, function(res) {
        response.end(res);
    });
});