【问题标题】:NodeJS wait until mySQL query is completedNodeJS 等到 mySQL 查询完成
【发布时间】:2016-01-28 17:06:59
【问题描述】:

我试图将一个对象从控制器传递到视图。因为我想让我的模型将我的查询与控制器分开,所以我正在加载一个 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 是异步工作的,并且不会等待任何功能完成。但必须有办法做到这一点。我做错了什么,或者我误解了什么?

提前致谢! ;)

【问题讨论】:

    标签: javascript mysql node.js express asynchronous


    【解决方案1】:

    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);
    

    【讨论】:

    • 太棒了,谢谢!一点旁注:在 else 语句中,您将 null 作为第一个参数传递。在processResult() 中记录result 时,它会返回null,因为第二个参数包含result
    • 谢谢!这对我来说是一个巨大的错误。我现在会更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多