2016-05-15 2 views
0

Я довольно новый два узла и паруса. Я пытаюсь создать две модели внутри одного действия. Мой вопрос заключается в том, как обрабатывать ошибки, которые могут возникать в обоих запросах.Обработка ошибок 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

@Bruno первый с асинксом намного более изящный. Но если вам нужны обе ошибки, вам нужно использовать вторую. – Bonanza

+0

, что имеет смысл, большое спасибо за объяснение – Bruno

Смежные вопросы