2015-08-14 27 views
1

我想知道如何在使用異步方法時正確處理流星錯誤。我已經嘗試了以下操作,但是錯誤是在客戶端回調的result參數中返回的,而不是error參數。使用未來的異步調用適當的流星錯誤處理使用未來

Server代碼:

Future = Npm.require('fibers/future'); 

Meteor.methods({ 
    'myServerMethod': function(){ 
     var future = new Future(); 

     // URL to some remote API 
     var url = UrlOfTheApiIWantToCall; 

     HTTP.get(url, {//other params as a hash}, 
      function (error, result) { 
       if (!error) { 
        future.return(result); 
       } else { 
        future.return(error); 
       } 
      } 
     ); 

     return future.wait(); 
    } 
}); 

客戶端代碼:

Meteor.call('myServerMethod', function (error, result) { 
    if(error){ 
     console.warn(error); 
    } 

    console.log('result', result); 
}); 

正如我上面說, '錯誤' 總是未定義在客戶端事件時HTTP.get()上服務器端返回一個錯誤。我也嘗試在服務器端替換future.return(error);future.throw(error);,但這確實在服務器端引發了錯誤。客戶端錯誤參數然後得到500服務器錯誤,雖然服務器上引發的錯誤是401未授權錯誤。

那麼,是否可以正確使用Fiber的Future,以便客戶端回調接收與服務器回調相同的錯誤參數?

+0

不是解決辦法,但澄清,'HTTP'呼叫可以在服務器端'變種解析度=同步HTTP.get(url,{})',還有很多其他的用例,我們需要在服務器端使用回調函數,我也在尋找一個好的答案 – Sasikanth

回答

4

按照Meteor.Error文檔在http://docs.meteor.com/#/full/meteor_error

方法可以拋出任何類型的異常。但Meteor.Error是服務器發送給客戶端的唯一錯誤。如果一個方法函數拋出一個不同的異常,那麼它將被映射到一個消毒版本。特別是,如果拋出錯誤的sanitizedError字段被設置爲Meteor.Error,那麼該錯誤將被髮送到客戶端。否則,如果沒有可用的清理版本,客戶端將得到Meteor.Error(500,「內部服務器錯誤」)。

這就是爲什麼你在客戶端收到500 Server Error。如果您想保留錯誤信息,並將它發送到客戶端,你可以做這樣的事情:

Future = Npm.require('fibers/future'); 

Meteor.methods({ 
    'myServerMethod': function(){ 
     var future = new Future(); 

     // URL to some remote API 
     var url = UrlOfTheApiIWantToCall; 

     HTTP.get(url, {//other params as a hash}, 
      function (error, result) { 
       if (!error) { 
        future.return(result); 
       } else { 
        future.throw(error); 
       } 
      } 
     ); 

     try { 
      return future.wait(); 
     } 
     catch(err) { 
      // Replace this with whatever you want sent to the client. 
      throw new Meteor.Error("http-error", err); 
     } 
    } 
}); 
+0

我不確定我明白try-catch在做什麼圍繞future.wait()...另外,我傾向於避免在JS中使用try-catch塊,因爲阻止整個函數被優化(參見:[https://github.com/petkaantonov/bluebird/wiki/優化殺手(https://github.com/petkaantonov/bluebird/wiki/Optimization-killers))。我必須拋出一個錯誤嗎?我想要做的就是向客戶端報告錯誤。我覺得投擲有點苛刻。 –

+0

你可以用'throw new Meteor.Error(...,...)替換'future.throw(error)'' – Curtis