我正在尝试使用 async.waterfall 按顺序对数据库执行查询,以便在出现错误时可以回滚所有查询。下面是我的代码:
function _getDBConnection(callback) {
try {
dbService.getConnection(function(connection) {
callback(null, connection);
});
} catch (e) {
callback(e, null);
}
}
function _insertNewUser(newUser, connection, callback) {
if (connection) {
var query = 'somequery';
// Start a transaction
connection.beginTransaction(function(error) {
if (error) {
callback(error, connection, null);
}
// Fire the query
connection.query(query, function(error, result) {
if (error) {
callback(error, connection, null)
} else {
callback(connection, newUser, result.insertId);
}
});
});
} else {
callback('Error: no connection in ', null, null);
}
};
module.exports.doRegister = function(req, res) {
// Collect all the params coming from the UI.
var newUser = {'object with UI params'};
console.log("Trying to register the user...");
async.series([
_getDBConnection,
async.apply(_insertNewUser, newUser)
], function(err, success) {
if (err) {
console.log(err);
} else {
res.status(200).json({
success: true,
message: 'User registeration successfully.'
});
}
});
};
问题:我没有正确接收来自 _getDBConnection 函数的连接对象到第二个函数 (_insertNewUser)。它是未定义的,因此,我收到以下错误。
TypeError: connection.beginTransaction is not a function ~~~~ 堆栈跟踪 ~~~~ 错误:回调已被调用 ~~~~ 堆栈跟踪 ~~~~
我想我得到的是“回调”函数,而不是 _insertNewUser 函数中的连接对象,这是意料之中的。我究竟做错了什么?
万一这很重要,我在 _insertNewUser 之后还有其他被调用的函数/查询,但是为了简洁起见,我已将它们从代码中删除。