【发布时间】:2015-11-01 15:40:23
【问题描述】:
我有一个 Node.js 应用程序(使用 sequelize 作为 orm),我尝试将其分离成可以轻松重用的不同模块。这意味着我需要删除它们之间的一些依赖关系,但我在某一点上很挣扎:
有一个名为“Account”的模块,它对其他模块应该(几乎)零依赖。它只提供基本的帐户功能。
然后还有其他模块,对account模块有依赖(没关系)。
目前,Account 模块依赖于其他模块,我想解决这个问题。现在,当创建帐户时,其他模块也必须在数据库中创建一些对象。这应该发生在同一个事务中,并且帐户模块不知道其他模块的任何信息。
目前,如下所示:
AccountController.prototype.createAccount = function (data) {
// validation checks etc. omited
return db.sequelize.transaction(function (t) {
return Q.Promise(function (resolve, reject, notify) {
_createHash(pw, 10)
.then(function (hash) {
data.passwordHash = hash;
return _createAccount(data, t);
})
.then(function (account) {
// create user
return [account, _createUser(account, t)];
})
.spread(function (account, user) {
// create another object
return [account, user, _createXXX(account, t)]
})
.spread(function(account, user, xxx) {
// create 1 more object
return [account, user, xxx, _createYYY(account, t)];
})
.spread(function (account, user, xxx, yyy) {
resolve([account, user, xxx, yyy]);
})
.catch(reject);
});
});
};
现在,我只想在这个模块中创建 Account 对象,让其他模块独立创建它们的对象,但在同一个事务中。
首先我考虑让 AccountController 在 Promise 链中发出一个“createAccount”事件,交出交易对象并让模块注册一些监听器。 但后来我注意到 EventEmitter 是异步工作的。
在 Node.js 中执行此类操作的最佳实践是什么?
【问题讨论】:
标签: javascript node.js dependency-injection sequelize.js