0

我正在尝试使用 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 之后还有其他被调用的函数/查询,但是为了简洁起见,我已将它们从代码中删除。

4

1 回答 1

0

如我所见,您正在使用 async.series。可能您应该使用 async.waterfall 将一个函数的结果传递给另一个函数。

Nodejs 异步系列 - 将参数传递给下一个回调

于 2017-11-11T14:49:16.820 回答