使用Sails.js执行Sql事务

StackOverflow地址

http://stackoverflow.com/questions/17794784/transactional-sql-with-sails-js

问题描述

楼主玩了一段时间的NodeJs/Express,觉得自己可以试试用Javascript全栈来做重写一个完整的大项目来看看效果如何。Sails.js看上去是一个不错的选择,后台支持Rest API,且支持使用Web Socket,正和楼主的口味,然而还有一个大问题没有解决,那就是如何在Nodejs中执行Sql事务。
大多数楼主见过的基于Nodejs的数据层/ORM并不支持MySQL的事务操作。Sails.js包含的ORM组件Waterline也是如此,但是奇怪的是我在一些文档描述和用户提问中有看到事务操作被经常提及。Knex.js这个组件支持事务,所以楼主想问是否能用它替换掉Waterline(除非Waterline作为Sails.js框架的核心)。
楼主还想问是否有除了Bookshelf之外的基于Knex.js之上的ORM组件,因为楼主其实对Backbone Model/Collection系统并不感冒。

最佳解答

你可以直接用Model.query()来写SQL查询。因为它是一个异步方法,你还需要使用promise或者async来连接他们。譬如,使用MYSQL adapter, async和一个User模型的例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
});