2017-01-30 8 views
0

私はNodeJSの新機能で、パラメータを渡してクエリを実行して呼び出し側に応答を返す再利用可能な関数を作成するソリューションを見つけるのに苦労しています。 。データベースのクエリを必要とする100以上の関数が存在するため、このようにしたいと思います。コードサイズを減らすのに役立ちます。NodeJS MySQL非同期 - オブジェクトを呼び出し元関数に戻す

私は非常に基本的なテストとして以下を試しましたが、dbA_Read_Data()関数は常に非同期であるためundefinedを返します。しかし、6日後、15以上の代替コールバック/約束ソリューションが私のために働いていませんでしたが、私はこの問題を解決して次のことを達成することはできません。

const { Databases } = require('../../utils/enums'); 
var mysql = require('mysql'); 


function getAllUsers() { 
    //This function would be called when an endpoint is hit in my HapiJS system. 
    var myQuery = "SELECT * FROM Users WHERE Account_Status== 'ACTIVE' "; 
    var response = dbA_Read_Data(myQuery); 

    return response; 
} 




//dbA => website database, contains users/permissions/etc 
//Other databases... you get the idea 

function dbA_Read_Data(query) { 
    dbConn = createConnection("localhost", Databases.db_A.name, Databases.db_A.username, Databases.db_A.password); 

    dbConn.connect(); 
    dbConn.query(query, function(err, rows, fields) { 
     if (err) throw err; 
     var myResponseObject = { 
      query: query, 
      data: { 
       count: rows.length, 
       records: rows 
      } 
     } 
    }); 
} 



function createConnection(host, database, user, password) { 
    var connection = mysql.createConnection({ 
     host: host, 
     user: user, 
     password: password, 
     database: database 
    }); 

    return connection; 
} 

は、どのように私は、呼び出し元の関数に応答オブジェクトを返すように機能dbA_Read_Data(query)を得るのですか?

+0

を、私はこの3回を読んで試してみましたそれに従うが、私はまだ未定義になるか、単にエラーが出るだろう。もう少し具体的なガイダンスが必要です – user5156141

+0

関数から何も返さなければ、常に未定義になります。 「単に発信者に返信する」ことはできません。これは、非同期応答では不可能です。応答を返すのをやめ、代わりにPromiseを返します。リンクされた質問はそれを行う方法を説明します。 – Paulpro

答えて

0

コメント欄のように、データベース呼び出しconn.queryは非同期なので、結果を単純に返すことはできません。このクエリの結果を取得して操作するために、Promiseを使用することができます。

私はあなたのdbA_Read_Data(query)機能はそのように見えることができたとします

function dbA_Read_Data(query){ 
    var dbConn = createConnection("localhost", Databases.db_A.name, Databases.db_A.username, Databases.db_A.password); 

    dbConn.connect(); 

    return new Promise(function(resolve, reject){ 

     dbConn.query(query, function(err, rows, fields) { 
      if (err) { 
       reject(err); 
      } else { 
       var myResponseObject = { 
        query: query, 
        data: { 
         count: rows.length, 
         records: rows 
        } 
       } 

       resolve(myResponseObject); 
      } 
     }); 

    }); 
} 

を次に、あなたのgetAllUsers()関数呼び出しは結果を得るために.then()必要になります。

function getAllUsers(){ 
    var myQuery = "SELECT * FROM Users WHERE Account_Status== 'ACTIVE' "; 

    return dbA_Read_Data(myQuery).then(function(result){ 
     return result; 
    }).catch(function(error){ 
     // handle the error properly here... 
     console.log('error in database operation'); 
    }); 
} 

getAllUsers().then(function(users){ 
    // do something with the result... 
    console.log(users); 
}); 
+0

こんにちは。ありがとうございました。私はすでにあなたが示したような(同じではないにしても)同様の方法でこれを解決しました – user5156141

関連する問題