How will a promisified mysql module work with NodeJS?

元气小坏坏 提交于 2019-12-17 20:16:10

问题


I'm trying to work with MySQL in NodeJS. My entire app is built with promises, so I want to promisify the mysql module as well.

So I have this:

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

Now, according to their API, the connect() method accepts a single parameter, an err callback to be called in case of connection error. My question is, how does that translate to promises?

Will the promise be resolved on error? Will it be rejected? Will I need to .catch() it perhaps? How does that work?


回答1:


If a method is a node "errback" with a single argument - it will be resolved with no parameters in the then or alternatively be rejected with the err passed to it. In the case of promisification, you can catch it with .error or use a catch with Promise.OperationalError.

Here is a simple approach:

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

If this is for managing connections - I'd use Promise.using - here is a sample from the 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;

Which would let you do:

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


来源:https://stackoverflow.com/questions/24797314/how-will-a-promisified-mysql-module-work-with-nodejs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!