我使用以下代码创建一些记录。如果我提供了不正确的值,比如说(密码和密码确认不匹配),那么有时会创建一个没有回滚的机构记录,有时会正常回滚。
我将不胜感激任何帮助。有更好的方法吗?
create: function (req, res) {
User.query("BEGIN TRANSACTION", function(result){
if(result) {
sails.log.info(result);
return res.serverError(result);
} else {
Institute.create({
name: req.param('name'),
shortName: req.param('shortName'),
phoneNumber: req.param('phoneNumber'),
subdomain: req.param('subdomain'),
managerEmail: req.param('email')
}, function(error, institute){
if(error) {
sails.log.info(error);
Institute.query("ROLLBACK", function(result) {
sails.log.info(result);
return res.badRequest(error);
});
} else {
User.create({
email: req.param('email'),
password: req.param('password'),
passwordConfirmation: req.param('passwordConfirmation'),
account: institute.id
}, function(error, user) {
if(error) {
sails.log.info(error);
Institute.query("ROLLBACK", function(result) {
sails.log.info(result);
return res.badRequest(error);
});
} else {
User.query("COMMIT", function(result){
sails.log.info(result);
return res.created(user);
});
}
});
}
});
}
});
}
答案 0 :(得分:1)
你有几个选择,没有特别的顺序。
<强> 1。编写一个函数,在创建之前进行所有可能的安全检查,或者对模型使用 beforeCreate
生命周期调用。
例如,您可以编写一个函数verifyParams(params)
,在创建机构之前为您的用户创建参数进行密码比较(以及您想要的任何其他检查)等检查,或者您可以只包含这些检查您的机构创建beforeCreate
方法。
<强> 2。如果您在创建用户期间出现错误,请删除
删除Institute
用户创建案例中的error
模型实例:
...
User.create(..., function (error, user) {
if (error) {
Institute.destroy(institute.id, function instDestroyed(err) {
...
});
} else {
...
}
});
第3。在您的学院模型 beforeCreate
方法中创建用户。
module.exports = {
attributes: { ... },
beforeCreate: function(values, next) {
User.create(..., function (err, user) {
if (err) { return next(err) }
return next();
});
}
}
就个人而言,我在自己的应用程序中使用方法#2。