Sails.js 创建不一致的记录

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);

我使用下面的代码创建一些记录。如果我提供了不正确的值,比如说(密码和密码确认不匹配),那么有时会在没有回滚的情况下创建一个institute记录,有时回滚会正常发生

我将感谢任何帮助。有更好的方法吗

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存在一个已知的问题,即不调用在类型中定义的自定义验证。因此,我必须将所有验证移到创建之前。