2016-11-21 21 views
1

角度-帆を使用sailsjsバックエンドは通常、このように呼ばれる:バックエンドでハンドル接続損失:reperform要求または再送応答

this.doSomethingWithItem = function(itemID, callback){ 
     $sails.put('/item/doSomething', {itemID:itemID}). 
     success(function (data, status, headers, config) { 
      callback(data); 
     }). 
     error(function (data, status, headers, config){ 
      alert('Error!'); 
     }); 
    }; 

は、帆(v0.11.0)のほとんどは、コントローラの機能はかなり単純です。例としては、次のようになります。

doSomething: function(req, res) { 
    var p = req.params.all(); 
    postgresClientPool.connect(function(err, client, done) { 
     client.query("SELECT item_do_something_in_this_awesome_function($1) AS dbreturn", [p.itemID], function(err, result) { 
     done(); 
     if(err) { 
      res.status(500).json({success: false}); 
     } 
     else { 
      res.json(result.rows[0].dbreturn[0]); 
     } 
    }); 
    }); 
} 

今、私たちは(クライアント/ブラウザとnodeJS /帆 - サーバ間の)かなり頻繁にではなく、短い接続損失を経験している影響を与えることができない理由のために。タスクは、ユーザーに対してできるだけスムーズに処理し、それ以上の不都合を回避するようになりました。要求がサーバーに到達する前または後に、接続の中断が発生した場合

  • チェック:継続的な要求中に接続が中断された場合

    ので、ロジックが何かのようにする必要があります。

  • 以前に発生した場合:要求を再実行してください。
  • その後に発生した場合:バックエンドにリクエストの結果を再送信するように指示します。

これを実現する方法は?

各サービス機能に$sails.on('disconnect'...を登録するのが最善の方法であるかどうかわかりません。そして、とにかく、関数の実行が終了した後、それらをどのように登録解除するのかはまだ分かりません。

+0

標準HTTPを使用しているため、バックエンドによる自動再送応答のオプションは使用できません。 Angularアプリでインターセプターを使用することをお勧めします。リクエストが接続を失った場合は、もう一度送信してみてください。 あまり複雑ではありません。 –

答えて

1

まず、ビジネスロジックをコントローラから分離することをお勧めします。ずっとやってなくても、そうすることによってsails.js access controller method from controller method

は、あなたが実際にコントローラから再び電話をかけることができるだろう:

あなたは、この他の答えを確認することができます。

また、asyncモジュールのasync.retry関数とasync.apply関数も使用します。

たとえば、あなたがapi/services/CustomerService.jsの元でのサービスにあなたのコードを移動想像:

module.exports = { 
    get: function (customerId, done) { 
     // postgresClientPool should be available in a param or globally? 
     // I'd prefer assigning it to the sails object... 
     // and use it like sails.postgresClientPool 
     postgresClientPool.connect(function (err, client, release) { 
      if (err) { 
      release(); 
      done(err); 
      } 
      client.query("SELECT getCustomer($1) AS dbreturn", [customerId], 
      function (err, result) { 
       release(); 
       if (err) { 
       done(err); 
       } else { 
       done(undefined, result.rows[0].dbreturn[0]); 
       } 
      }); 
     }); 
     } 
    }; 

を次に、あなたのコントローラでは、例えば、api/controllers/Customer.jsは:

get: function (req, res) { 
    var p = req.params.all(); 
    async.retry(3, async.apply(CustomerService.get, p.customerID), function (err, result) { 
     if (err) { 
     res.status(500).json({ 
      success: false 
     }); 
     } else { 
     res.json(result); 
     } 
    }) 
    } 

あなたがで非同期を要求すべきですあなたのコントローラーのトップ。

+0

これらのヒントをありがとう!しかし、あなたの答えが私の実際の問題に対処しているかどうかは分かりません。接続が失われたためにres.jsonがクライアント(ブラウザ)に到達しない場合、非同期エラーがここに入り、再試行をトリガーしますか?疑わしい。 – cis

関連する問題