我正在尝试在NodeJS中使用MySQL。我的整个应用程序都是基于Promise构建的,因此我也想推广该mysql模块。
mysql
所以我有这个:
Promise = require('bluebird'); var mysql = Promise.promisifyAll(require('mysql'));
现在,根据他们的API,该connect()方法接受一个参数,err即在发生连接错误时调用的回调。我的问题是,这如何转化为承诺?
connect()
err
承诺会因错误而解决吗?会被拒绝吗?我.catch()可能需要吗?这是如何运作的?
.catch()
如果某个方法是带有单个参数的节点“ errback”-它将在中没有任何参数地进行解析,then或者err通过传递给它而被拒绝。如果是promisification,则可以使用.error或使用Promise.OperationalError。
then
.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的示例:
Promise.using
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. });