Sails.js 创建不一致的记录
我使用下面的代码创建一些记录。如果我提供了不正确的值,比如说(密码和密码确认不匹配),那么有时会在没有回滚的情况下创建一个institute记录,有时回滚会正常发生 我将感谢任何帮助。有更好的方法吗Sails.js 创建不一致的记录,sails.js,waterline,Sails.js,Waterline,我使用下面的代码创建一些记录。如果我提供了不正确的值,比如说(密码和密码确认不匹配),那么有时会在没有回滚的情况下创建一个institute记录,有时回滚会正常发生 我将感谢任何帮助。有更好的方法吗 create: function (req, res) { User.query("BEGIN TRANSACTION", function(result){ if(result) { sails.log.info(result);
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);
});
}
});
}
});
}
});
}
你有几个选择,没有特别的顺序 1。编写一个函数,在创建之前进行所有可能的安全检查,或者在创建之前使用模型的生命周期调用。
module.exports = {
attributes: { ... },
beforeCreate: function(values, next) {
User.create(..., function (err, user) {
if (err) { return next(err) }
return next();
});
}
}
例如,您可以编写一个函数verifyParams(params)
,在创建机构之前对用户创建参数进行检查,如密码比较(以及您想要的任何其他检查),或者您可以只在机构创建的beforeCreate
方法中包含这些检查
2。如果用户创建过程中出现错误,请删除
删除用户创建的错误案例中的机构
模型实例:
...
User.create(..., function (error, user) {
if (error) {
Institute.destroy(institute.id, function instDestroyed(err) {
...
});
} else {
...
}
});
3。在创建
方法之前,在您机构模型的中创建一个用户。
module.exports = {
attributes: { ... },
beforeCreate: function(values, next) {
User.create(..., function (err, user) {
if (err) { return next(err) }
return next();
});
}
}
就我个人而言,我在自己的应用程序中使用方法2。谢谢您的选择。我已经考虑过了。但我认为,当出现错误时,很容易取消该事务,而不是删除创建的模型。我的问题是负责回滚事务的代码有时没有被调用。大多数情况下,它是有效的。嗯,你确定代码识别出存在验证错误吗?奇怪的是,它有时能工作,但不是所有时候都能工作——我有一种感觉,在它不能回滚的情况下,这是一些代码没有涵盖的验证情况。SAIL存在一个已知的问题,即不调用在类型中定义的自定义验证。因此,我必须将所有验证移到创建之前。