创建两个模型时sailsjs错误处理

时间:2016-05-15 11:46:33

标签: javascript node.js orm sails.js

我是新的两个nodejs和sails。我想在一个动作中创建两个模型。我的问题是如何处理两个查询中可能发生的错误。

当前代码:

new: function (req, res) {
    var errorArray = [];
    var data = req.allParams();

        User.create({
            username: data.username,
            password: data.password,
            device_id: data.device_id,
            own_number: data.own_number,
            mobile_numbers: data.mobile_numbers
        }).exec(function (err, user) {
            if(err){
            errorArray.push(err);
            }
        });

        Mobile_number.create({
          number: data.own_number,
          number_id: this.hash(data.own_number)
        }).exec(function(err, mobile_number){
          sails.log(err);
          if(err){
            errorArray.push(err);
          }
       });

       if(errorArray.length == 0){
         return res.ok('success');
       }else {
        return res.send(errorArray.toString());
       }    
  }

此代码的问题是在查询完成之前处理最后的if。什么是等待查询的正确方法?

布鲁诺

1 个答案:

答案 0 :(得分:1)

首先,您的代码将无法运行,因为node.js是异步的。因此,在执行函数之前检查是否存在错误。以下是两个解决方案:

您可以使用async.series。如果你使用它,如果第一个方法失败它将停止执行,它将返回它的错误。它成功了它将采用第二种方法。

async.series([
        function(callback) {
            User.create({
                username: data.username,
                password: data.password,
                device_id: data.device_id,
                own_number: data.own_number,
                mobile_numbers: data.mobile_numbers
            }).exec(callback);
        },
        function(callback) {
            Mobile_number.create({
                number: data.own_number,
                number_id: this.hash(data.own_number)
            }).exec(callback);
        }
    ],
    function(error, results) {
        // error first finished 
        if(error)
            res.send('error');
        else
            res.send('success');
    }
);

或者你可以通过回调传统方式。

new: function(req, res) {
    var errorArray = [];
    var data = req.allParams();

    var mobileCreateCallback = function(err, mobile_number, user) {
        sails.log(err);
        if (err) {
            errorArray.push(err);
        }

        if (errorArray.length === 0) {
            sails.log(user, mobile_number);
            return res.ok('success');
        } else {
            return res.send(errorArray.toString());
        }
    };

    var userCreateCallback = function(err, user) {
        if (err) {
            errorArray.push(err);
        }

        Mobile_number.create({
            number: data.own_number,
            number_id: this.hash(data.own_number)
        }).exec(function(error, mobile_number) {
            mobileCreateCallback(error, mobile_number, user);
        });
    };

    User.create({
        username: data.username,
        password: data.password,
        device_id: data.device_id,
        own_number: data.own_number,
        mobile_numbers: data.mobile_numbers
    }).exec(userCreateCallback);
}

你应该关注回调:callbackhell和node.js / sails.js中的异步函数。