【发布时间】:2017-11-11 22:49:16
【问题描述】:
我正在尝试使用 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 不是函数 ~~~~ 堆栈跟踪 ~~~~ 错误:回调已被调用 ~~~~ 堆栈跟踪 ~~~~
我想我在 _insertNewUser 函数中得到了“回调”函数而不是连接对象,这是意料之中的。我做错了什么?
万一这很重要,我在 _insertNewUser 之后还有其他函数/查询被调用,但为了简洁起见,我已将它们从代码中删除。
【问题讨论】:
-
dbService.getConnection( function(connection)?我认为您不需要dbService.getConnection (err, connection)的包装器。 -
没有区别。即使在进行了更改之后,我在 _insertNewUser 中获得了一个用于连接的 [Function] 而不是获得一个对象,并且回调是未定义的。
标签: javascript node.js async.js mysqljs