NodeJS等到mySQL查询完成

时间:2016-01-28 17:07:00

标签: javascript mysql node.js express asynchronous

我试图将一个对象从控制器传递给视图。因为我希望我的模型将我的查询从控制器中分离出来,所以我加载了一个JS对象(模型)。

我的模型如下:

function MyDatabase(req) {
  this._request = req;
  this._connection = null;

  this.init();
};


MyDatabase.prototype = {
  init: function() {
    this._request.getConnection( function(err, con) {
      if(err) return false;
      return this._connection = con;
    }.bind(this));
  },

  getFromTable: function(table) {
    this._connection.query('SELECT * FROM '+ table +';', function(err, result) {
      if(err) 
        return false;
      else if( !result )
        return {error: 'Error bij het ophalen van foto\'s'};
      else
        return result;
    }.bind(this));
  }
};

module.exports = MyDatabase;

但我无法弄清楚如何在我的控制器中完成此查询。我找到了async模块并尝试了多个函数,如瀑布和并行,但它们都没有为我工作(或者我没有按原样使用它)。

我的控制器目前看起来如下所示:

var myDatabase = require('../dbmodel');

router.get('/', function(req, res, next) {
  var db = new myDatabase(req);

  async.waterfall([
    function(callback) {
      var db = new myDatabase(req);
      var photos = db.getFromTable('photos');

      callback(null, photos);
    }
  ], function(p) {
    res.locals.photos = p;
    res.render('photos');
  } );
});

我做错了什么?我知道NodeJS工作异步并且不等待任何功能完成。但必须有一种方法可行。我做错了什么,或者我误解了什么?

先谢谢了! ;)

1 个答案:

答案 0 :(得分:2)

getFromTable方法应接受将处理其执行结果的回调。

// Accept a callback as a parameter
getFromTable: function(table, callback) {
  this._connection.query('SELECT * FROM '+ table +';', function(err, result) {
    if(err) 
      // execute the callback for a null result and an error.
      callback(err, null);
    else if( !result )
      callback(new Error('Error bij het ophalen van foto\'s'),null);
    else
      // execute the callback on the result
      callback(null, result);
    }.bind(this));
  }

现在可以这种方式使用该方法:

// This is the callback to be passed into the method.
function processResult(err, result) {
  console.log(result);
}
db.getFromTable('photos', processResult);