所以我现在一直在玩NodeJS / Express,我真的想尝试使用完整的JavaScript堆栈重写一个相对较大的副项目,看看它是如何工作的。 Sails.js对于支持Web套接字的REST API的NodeJS后端似乎是一个非常好的选择,这正是我正在寻找的,但是我希望解决的另一个问题是NodeJS中的事务性SQL。 / p>
我在NodeJS方面看到的大多数数据层/ orms在处理MySQL时似乎都不支持事务。与Sails.js(Waterline)一起提供的ORM似乎也不支持奇怪的交易,因为我已经看到了它所提到的地方尽管这些评论已经很老了。 Knex.js支持事务,所以我想知道是否很容易用这个替换ORM是Sails.js(或者如果Sails.js在核心框架中假定为Waterline)。
我还想知道除了Bookshelf之外是否还有基于Knex.js构建的ORM,因为我不是Backbones Model / Collection系统的粉丝?
答案 0 :(得分:17)
您仍然可以使用Model.query()
直接编写SQL查询。由于这是一个异步函数,因此您必须使用promises或async
对其进行重新序列化。例如,使用MySQL适配器async
和名为User
的模型:
async.auto({
transaction: function(next){
User.query('BEGIN', next);
},
user: ['transaction', function(next) {
User.findOne(req.param('id')).exec(next);
}],
// other queries in the transaction
// ...
}, function(err, results) {
if (err) {
User.query('ROLLBACK', next);
return next(err);
}
User.query('COMMIT', next);
// final tasks
res.json(results.serialize);
});
答案 1 :(得分:6)
我们正在为ORM级别的交易提供原生支持: https://github.com/balderdashy/waterline/issues/62
协会可能会先出现,但接下来是交易。我们刚刚完成GROUP BY和聚合(SUM,AVG等)
答案 2 :(得分:1)
SailsJS中的交易比预期的要复杂得多。目标是让ORM适配器知道模型上的两个非常不同的控制器操作将通过单个MySQL连接发送。
执行此操作的自然方法是编写一个新的适配器,该适配器接受附加信息以指示查询属于事务调用。这样做需要更改waterline
(风帆ORM抽象模块)本身。
结帐是否有帮助 - https://www.npmjs.com/package/sails-mysql-transactions