如何使用 bluebird 承诺 MySql 函数?

How to promisify a MySql function using bluebird?

前段时间我决定从 PHP 切换到节点。在我的第一个项目中,我不想使用任何 ORM,因为我认为我不需要让我的生活如此复杂地学习另一件事(目前我正在学习节点和 angular)因此我决定只使用 mysql 包。重要的是要说我有一些复杂的查询,我不想从 sctratch 中学习如何使用 9000 ORM 节点之一使它们工作,这就是我到目前为止所做的:

thing.service.js

Thing.list = function (done) {
  db.query("SELECT * FROM thing...",function (err,data) {
    if (err) {
      done(err)
    } else {
      done(null,data);
    }
  });
};
module.exports = Thing;

thing.controler.js

Thing = require('thing.service.js');
Thing.list(function (err,data) {
  if (err) {
    res.status(500).send('Error D:');
  } else {
    res.json(data);
  }
});

如何使用 bluebird 来承诺这种功能?我已经尝试过但是......我在这里寻求帮助。这是我试过的

var Thing = Promise.promisifyAll(require('./models/thing.service.js'));

Thing.list().then(function(){})

我对 promisifyAll 和 IMO 从来没有太多运气,我更喜欢手动处理我的内部检查。这是我将如何处理此问题的示例:

//ThingModule
var Promises = require('bluebird');

Things.list = function(params) {
 return new Promises(function(resolve, reject) {
   db.query('SELECT * FROM thing...', function(err, data) {
     return (err ? reject(err) : resolve(data));
   });

 });
}

//usage
var thinger = require('ThingModule');

thinger.list().then(function(data) {
   //do something with data
})
.error(function(err) {
  console.error(err);
})

我已经这样做了,效果很好。

const connection = mysql.createConnection({.....});
global.db  = Bluebird.promisifyAll(connection);
db.queryAsync("SELECT * FROM users").then(function(rows){   
console.log(rows);});

您还可以创建一个触发 SQL 的函数,如下所示:-

function sqlGun(query, obj, callback) {
    mySQLconnection.query(query, obj, function(err, rows, fields) {
        if (err) {
            console.log('Error  ==>', err);
            // throw err;
            return (err, null);
        }
        console.log(query)
        if (rows.length) {
            return callback(null, rows);
        } else {
            return callback(null, [])
        }
    });

}

其中 mySQLconnection 是您在 mysql.createConnection({}).

之后获得的连接对象

在那之后,你可以 promisify 函数并像下面这样使用 promise :-

var promisified = Promise.promisify(sqlGun);
promisified(query, {}).then( function() {} );