小编典典

承诺的mysql模块如何与NodeJS一起使用?

mysql

我正在尝试在NodeJS中使用MySQL。我的整个应用程序都是基于Promise构建的,因此我也想推广该mysql模块。

所以我有这个:

Promise = require('bluebird');
var mysql = Promise.promisifyAll(require('mysql'));

现在,根据他们的API,该connect()方法接受一个参数,err即在发生连接错误时调用的回调。我的问题是,这如何转化为承诺?

承诺会因错误而解决吗?会被拒绝吗?我.catch()可能需要吗?这是如何运作的?


阅读 387

收藏
2020-05-17

共1个答案

小编典典

如果某个方法是带有单个参数的节点“
errback”-它将在中没有任何参数地进行解析,then或者err通过传递给它而被拒绝。如果是promisification,则可以使用.error或使用Promise.OperationalError

这是一个简单的方法:

function getConnection(){
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'me',
      password : 'secret'
    });
    return connection.connectAsync().return(connection); // <- note the second return
}

getConnection().then(function(db){
    return db.queryAsync(....);
}).error(function(){
   // could not connect, or query error
});

如果这是用于管理连接-我会使用Promise.using-这是API的示例:

var mysql = require("mysql");
// uncomment if necessary
// var Promise = require("bluebird");
// Promise.promisifyAll(mysql);
// Promise.promisifyAll(require("mysql/lib/Connection").prototype);
// Promise.promisifyAll(require("mysql/lib/Pool").prototype);
var pool  = mysql.createPool({
    connectionLimit: 10,
    host: 'example.org',
    user: 'bob',
    password: 'secret'
});

function getSqlConnection() {
    return pool.getConnectionAsync().disposer(function(connection) {
        try {
            connection.release();
        } catch(e) {};
    });
}

module.exports = getSqlConnection;

这会让你做:

Promise.using(getSqlConnection(), function(conn){
    // handle connection here, return a promise here, when that promise resolves
    // the connection will be automatically returned to the pool.
});
2020-05-17