【问题标题】:sailsjs error handling when creating two models创建两个模型时的sailsjs错误处理
【发布时间】:2016-05-15 11:46:33
【问题描述】:

我是两个 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 是在查询完成之前处理的。等待查询的正确方法是什么?

布鲁诺

【问题讨论】:

    标签: javascript node.js orm sails.js


    【解决方案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 中的异步函数。

    【讨论】:

    • 你会推荐哪个?
    • @Bruno first with async 更加优雅。但是,如果您需要两个错误,则需要使用第二个。
    • 有道理,非常感谢您的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2018-03-20
    • 2021-07-14
    相关资源
    最近更新 更多