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

Posted

技术标签:

【中文标题】创建两个模型时的sailsjs错误处理【英文标题】:sailsjs error handling when creating two models 【发布时间】: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 是在查询完成之前处理的。等待查询的正确方法是什么?

布鲁诺

【问题讨论】:

【参考方案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 更加优雅。但是,如果您需要两个错误,则需要使用第二个。 有道理,非常感谢您的解释

以上是关于创建两个模型时的sailsjs错误处理的主要内容,如果未能解决你的问题,请参考以下文章

posix_spawn() :使用 posix_spawn() 时的错误处理问题

模型创建时的简单 RNN Python Tensorflow 错误

保留 kPasteboardTypeFileURLPromise 时的错误处理

执行多个查询时的 Doctrine (DBAL) 错误处理

PySpark 读取不存在文件时的错误处理

使用长文件路径时的 Get-ChildItem 错误处理