2015-08-02 4 views
4

У меня есть небольшой проект с узлом nodejs + express, и я также сделал небольшой сервис для совместного использования на некоторых его страницах.NodeJS и mysql: дождаться результата запроса

var mysql = require('mysql'); 

var pool = mysql.createPool({ 
     connectionLimit : 100, 
     host  : 'host', 
     user  : 'user', 
     password : 'password', 
     database : 'database', 
     debug : false 
}); 

function executeQuery(query, callback) { 
    pool.getConnection(function (err, connection) { 
     if (err) { 
      return callback(err, null); 
     } 
     else if (connection) { 
      connection.query(query, function (err, rows, fields) { 
       connection.release(); 
       if (err) { 
        return callback(err, null); 
       } 
       return callback(null, rows); 
      }) 
     } 
     else { 
      return callback("No connection", null); 
     } 
    }); 
} 


function getResult(query) { 
    return executeQuery(query, function (err, rows) { 
       if (!err) { 
        return rows; 
       } 
       else { 
        console.log(err); 
       } 
      }); 
} 

function getServers() 
{ 
    var list = getResult("select * from table"); 
    return list; 
} 

exports.getList = getList; 

Теперь моя проблема: когда я вызываю module.GetServers(); из другого модуля результат всегда неопределен, потому что pool.getConnection является асинхронным (я полагаю, я совершенно новый), поэтому executeQuery не дает результата. Как заставить execQuery ждать получения результата connection.query?

+0

Обратите внимание, что все методы nodejs принимают функцию обратного вызова в качестве параметра - вам нужно сделать то же самое в своей функции getServers. Затем, когда вы возвращаете строки из запроса, вызовите обратный вызов, передав строки в качестве параметра. – adelphus

ответ

4

В вашей функции executeQuery вы использовали обратные вызовы для ожидания результатов. Точно так же, реализуя их в функции getResult, вы можете дождаться результатов после выполнения запроса. Что-то вроде этого.

var mysql = require('mysql'); 
var pool = mysql.createPool({ 
    connectionLimit : 100, 
    host  : 'host', 
    user  : 'user', 
    password : 'password', 
    database : 'database', 
    debug : false 
}); 

function executeQuery(query, callback) { 
pool.getConnection(function (err, connection) { 
    if (err) { 
     return callback(err, null); 
    } 
    else if (connection) { 
     connection.query(query, function (err, rows, fields) { 
      connection.release(); 
      if (err) { 
       return callback(err, null); 
      } 
      return callback(null, rows); 
     }) 
    } 
    else { 
     return callback(true, "No Connection"); 
    } 
}); 
} 


function getResult(query,callback) { 
    executeQuery(query, function (err, rows) { 
    if (!err) { 
     callback(null,rows); 
    } 
    else { 
     callback(true,err); 
    } 
    }); 
} 

function getServers() 
    { 
getResult("select * from table",function(err,rows){ 
    if(!err){ 
     return rows; 
    }else{ 
     console.log(err); 
    } 
    }); 

} 

exports.getList = getList; 
+0

'var getResult = executeQuery;' – robertklep

Смежные вопросы