2016-03-02 88 views
1

一直试图promisify node-mysql2事务,但无法让它工作,任何指针?bluebird node-mysql2事务

我经历过的文档在http://bluebirdjs.com/docs/api/disposer.html

我也有非交易相关的代码工作版本,但得到的交易工作,在适当的资源配置和错误处理沿着已经很难。这里有回调基于从节点mysql的API文档

connection.beginTransaction(function(err) { 
    if (err) { throw err; } 
    connection.query('INSERT INTO posts SET title=?', title, function(err, result) { 
    if (err) { 
     return connection.rollback(function() { 
     throw err; 
     }); 
    } 

    var log = 'Post ' + result.insertId + ' added'; 

    connection.query('INSERT INTO log SET data=?', log, function(err, result) { 
     if (err) { 
     return connection.rollback(function() { 
      throw err; 
     }); 
     } 
     connection.commit(function(err) { 
     if (err) { 
      return connection.rollback(function() { 
      throw err; 
      }); 
     } 
     console.log('success!'); 
     }); 
    }); 
    }); 
}); 

这里是我的查询管理

import { mysqldb } from '../config'; 
import { createPool } from 'mysql2'; 
import Pool from 'mysql2/lib/pool'; 
import Connection from 'mysql2/lib/connection'; 
import { using, promisifyAll, try as promiseTry } from 'bluebird'; 

promisifyAll([Pool, Connection]); 
const pool = createPool(mysqldb); 

export const getConnection =() => 
    pool.getConnectionAsync().disposer(connection => 
     connection.release()); 

export const withTransaction = (fn) => 
    using(getConnection(), tx => 
    promiseTry(fn(tx), tx.beginTransaction()).then(
     res => tx.commitAsync().catch(e => e).thenReturn(res), 
     err => tx.rollbackAsync().catch(e => e).thenThrow(err) 
    ) 
); 

// withTransaction(tx => 
// tx.executeAsync('sql1') 
//  .then(tx.executeAsync('sql2')) 
//  .then(tx.executeAsync('sql3')) 
//  .then(tx.executeAsync('sql4')) 
//); 

export const query = (sql, params) => 
    using(getConnection(), connection => 
    connection.executeAsync(sql, params) 
); 

实现采取落实然而交易给我

Unhandled rejection TypeError: expecting a function but got [object Object] 
    at apiRejection (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:10:27) 
    at Promise.attempt.Promise.try (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/method.js:26:16) 
    at /Users/willh/workspace/ChenPin/graphql/lib/services/mysql.js:35:30 
    at tryCatcher (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/util.js:16:23) 
    at /Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/using.js:184:26 
    at tryCatcher (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/util.js:16:23) 
    at Promise._settlePromiseFromHandler (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:503:31) 
    at Promise._settlePromise (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:560:18) 
    at Promise._settlePromise0 (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:605:10) 
    at Promise._settlePromises (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:684:18) 
    at Promise._fulfill (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:629:18) 
    at PromiseArray._resolve (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise_array.js:125:19) 
    at PromiseArray._promiseFulfilled (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise_array.js:143:14) 
    at Promise._settlePromise (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:565:26) 
    at Promise._settlePromise0 (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:605:10) 
    at Promise._settlePromises (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:684:18) 
    at Promise._fulfill (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:629:18) 
    at Promise._resolveCallback (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:424:57) 
    at Promise._settlePromiseFromHandler (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:515:17) 
    at Promise._settlePromise (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:560:18) 
    at Promise._settlePromise0 (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:605:10) 
    at Promise._settlePromises (/Users/willh/workspace/ChenPin/graphql/node_modules/bluebird/js/release/promise.js:684:18) 

什么是正确的办法?

更新:

得到它通过源代码去上班,原来这只是一个简单的辅助,真是不值得使用他们的助手,下面是最终的工作版本。感谢反正帮助:d

export const withTransaction = (fn) => 
    using(getConnection(), tx => 
    tx.queryAsync('START TRANSACTION').then(fn(tx)).then(
     res => tx.queryAsync('COMMIT').thenReturn(res), 
     err => tx.queryAsync('ROLLBACK').catch(e => e).thenThrow(err) 
    ) 
); 

// withTransaction(tx => 
// tx.executeAsync('select :x + :y as z', { x: 1, y: 2 }).then(res1 => 
// tx.executeAsync('select :x + :y as z', { x: res1[0].z, y: 1 })).then(res2 => 
// tx.executeAsync('select :x + :y as z', { x: res2[0].z, y: 1 })).then(res3 => 
// tx.executeAsync('select :x + :y as z', { x: res3[0].z, y: 1 })).then(res4 => res4) 
//); 

顺便说一下,原来promisify方法的工作,没有什么区别,但感谢帮助我!

回答

1

你得到了错误,因为promisifyAll适用于函数而不是对象。在大多数情况下,功能都在类的prototype之内。试试这个

var Promise = require('bluebird'); 
var mysql = require('mysql2'); 
Promise.promisifyAll(mysql.Connection.prototype); 
Promise.promisifyAll(require('mysql2/lib/pool').prototype) 

在我上面的练习例子中工作得很好。

如果你觉得你想要更多的实验在这方面,你也可以手动遍历通的所有元素,只挑功能,如在下面的例子中,我个人使用的Postgres

var Promise = require('bluebird'); 
var pg = require('pg'); 
Object.keys(pg).forEach(function (key) { 
    var Cls = null; 
    try { 
    Cls = pg[key]; 
    if (typeof Cls === 'function') { 
     Promise.promisifyAll(Cls.prototype); 
     Promise.promisifyAll(Cls); 
    } 
    } catch (e) { 
    console.log(e); 
    } 
}); 
Promise.promisifyAll(pg);