mysql - Node/Bluebird/MySQL 事务

标签 mysql node.js promise bluebird

在过去的一周里,我一直在与 Bluebird promise 库和 MySQL 作斗争。我不断发现 doco 假设我完全沉浸在他们的术语中,并且通常只给出示例中一半的答案,或者根本没有。让我绞尽脑汁想弄清楚如何使用它。

目前我正在尝试执行一系列 SQL 命令以在事务中创建数据库记录。我正在使用这段代码:

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

function getConnection() {
    return pool.getConnectionAsync().disposer(function (connection) {
        connection.release();
    });
}

function getTransaction(connection) {
    return connection.beginTransactionAsync().disposer(function (tx, promise) {
        if (promise.isFulfilled()) {
            tx.commitAsync();
        } else {
            tx.rollbackAsync();
        }
    });
}

Database.prototype.addStory = function (projectId, title, text) {
    return Promise.using(getConnection(), function (connection) {
        return Promise.using(getTransaction(connection), function () {
            return connection.queryAsync('INSERT INTO story SELECT ?, MAX(storyNumber) + 1, ?, ?, 0 FROM story WHERE projectID = ?',
                [projectId, title, text, projectId])
                .then(connection.queryAsync('select LAST_INSERT_ID()'))
                .then(function (rows) {
                    debug("Returning story for %s", rows[0]);
                    return getStory(connection, rows[0]);
            });
        });
    });
}

目前我遇到了这个错误:

TypeError: tx.rollbackAsync is not a function

根据我的阅读,我的代码应该可以工作。有谁知道它有什么问题吗?

最佳答案

谢谢大家的回答。

我现在找到了 Knex API 用更少的代码解决了我所有的问题。

关于mysql - Node/Bluebird/MySQL 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38068397/

相关文章:

php - Laravel 查询生成器 - 查询不工作但在 SQL 控制台中工作

javascript - 使用父类(super class)的子类中定义的静态属性

javascript - 将 csv 转换为 json 返回空 json 文件

javascript - 调试未处理的 Promise 拒绝

javascript - 异步关系上的 Ember 数据计算属性

mysql - 在 SELECT 语句中使用 "IF"检查是否存在另一列

php - 使用带有 N 查询的 "USING"子句 Eloquent 地加入

MySQL 从具有规范的文本列中选择

javascript - 为什么我尝试将 SQL 查询中的行获取到脚本中的全局变量中却只得到一个空数组?

javascript - 如何使用 RXJS 动态链接函数调用?