2017-01-30 2 views
0

Я новичок в NodeJS и изо всех сил стараюсь найти решение для создания функции повторного использования для выполнения запроса (переданного через параметр), а затем просто вернуть ответ вызывающему абоненту , Я хочу сделать это так, потому что будет более 100 функций, требующих запросов к базе данных, и это поможет уменьшить размер кода.NodeJS MySQL Async- Возвращаемый объект обратно к функции вызывающего абонента

Я пробовал следующее как очень примитивный тест, но функция 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