Sails创建不一致的记录

时间:2014-09-09 06:35:03

标签: sails.js waterline

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

我将不胜感激任何帮助。有更好的方法吗?

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 个答案:

答案 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。