2016-05-15 38 views
0

我很新的两个nodejs和帆。我试图在一个动作中创建两个模型。我的问题是如何处理这两个查询中可能发生的错误。sailsjs错误处理创建两个模型时

目前代码:

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

这段代码的问题是,如果在年底完成查询之前进行处理。什么是等待查询的正确途径?

Bruno

回答

1

首先你的代码不会工作,因为node.js是异步的。所以你在函数执行前检查是否有错误。以下是2种解决方案:

您可以使用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。

+0

你会推荐哪个? – Bruno

+0

@布鲁诺第一次与异步更优雅。但是如果你需要这两个错误,你需要使用第二个。 – Bonanza

+0

这是有道理的,非常感谢你的解释 – Bruno