2016-11-25 14 views
0

503エラーの原因を取り除く特別なケースがあります。次のコードスニペットは、私のAPIコールがこのAPIエンドポイントに行われた場合と全く結果が制御移行を発見したときにシステムがどの結果処理503特にTryCatchの場合のExpress/Node.jsのエラー

app.post('/api/fetch/user', function(req, res){ 
    var email = req.body.emailTxt; 
    db.one('SELECT * FROM users WHERE email=$1', [email]) 
     .then(function(data){ 
      console.log('DATA:', data); 

      var userCard = { id: data.user_id, name: data.user_name, 
          email: data.email, regDate: data.date_created }; 

      res.status(200).json({ 'valid': true, '_payload': userCard }); 
     }) 
     .catch(function(error){ 
      if(error.search(/No data returned from the query/im) > 0) // regex case insensitive search and search multiline as source string is multiline 
       res.status(500).send('Invalid Request Match'); 
      else 
       res.status(500).send('ERROR: '+error); 
     })   

});

を見つけることができないときに実行さcatch文を持っていますcatch()にありますが、それは奇妙ですが、かなり奇妙なことに、503 - Request timeoutエラーを返します。 デバッグするためにif()の条件を削除しようとしましたが、if-elseがExpressJで動作していないように見えます。

注:すべてが正常に機能し、制御が.then()にある場合でも動作します。 if,elseを削除して単純なエラー表示/応答を返すと、すべて正常に動作します。私のAPIには特別なものは何も含まれていません。私はAPIをテストするために準備した単一のページスクリプトです。

答えて

1

.catchブロックにエラーがあると思います。

app.post('/api/fetch/user', function(req, res){ 
    var email = req.body.emailTxt; 
    db.one('SELECT * FROM users WHERE email=$1', [email]) 
     .then(function(data){ 
      console.log('DATA:', data); 

      var userCard = { id: data.user_id, name: data.user_name, 
           email: data.email, regDate: data.date_created }; 

      res.status(200).json({ 'valid': true, '_payload': userCard }); 
     }) 
     .catch(function(error){ 
      console.error(error); //never ignore errors! 
      try { 
      //i think error is an Error Object here, so it doesn't have .search function 
      if(error.search(/No data returned from the query/im) > 0) // regex case insensitive search and search multiline as source string is multiline 
       res.status(500).send('Invalid Request Match'); 
      else 
       res.status(500).send('ERROR: '+error); 
      } catch (err) { 
      console.error(err); 
       res.status(500).send('some unknown error'); 
      }; 
     }); 
     }); 
  1. 編集を::

    は、コードを変更し、このことができますかどうかを確認してくださいあなたは二度、応答を送信する可能性があるため、申し訳ありませんが、.finallyを削除しました。

  2. 編集すると、.catchブロックのエラー処理に適しています。


//make catch block error safe to make sure no error occurs 
if (error && error.message == 'No data returned from the query.') { 
    res.status(500).send('Invalid Request Match'); 
} else { 
    res.status(500).send('ERROR: '+error); 
} 
+0

一つのタイプミスしかし、あなたが言及した 'catch'は、機能を取り、唯一のパラメータを渡すことができますしません。 はい、正しい方向を指していますが、 'error'には' .search() 'がありません。この場合、エラーメッセージ文字列を解析するにはどうすればよいですか?コンソール(マルチライン)でエラーが表示されます。 'エラー:QueryResultError { code:queryResultErrorCode.noData message:"クエリから返されたデータがありません。" 受信:0 クエリ:" SELECT * FROM users where email = '[email protected]' AND password = '1234' "} –

+0

Hurrey !!あなたの指示に従って問題を解決しました。 'error.toString();'を使用して文字列へのオブジェクトは '.toString()'としてグローバルメソッドであり、私のために働いています –

+0

データベースが適切な 'QueryResultError'を返すので、 'catch'ブロックエラーを処理するためのより良いアプローチで答えを編集しました。 – iKoala

0

APIサービスを作成するときに、ExpressJで応答コードを非常に集中的に使用します。だから、catch()の中でif-elseを実行する代わりに、それらを直接使用するのは正しい方法です。

したがって、正しい方法は次のようになります。表示したい場合は

.catch(function(error){ 
     console.log('ERROR:', error); 
     res.status(204).send('No Content; Invalid Request Match'); 
    }) 

ただし、/あなたにもそれを行うことができ、詳細なメッセージを返します。返信方法の詳細については、http://expressjs.com/en/api.html#resをご確認ください。 HTMLテンプレートをレンダリングしたり、JSONレスポンス、さらには複数行のテキストを返すことができます。

なぜif-elseが問題を引き起こすのか分かりませんが、逆に進むことができます。

具体的には、errorには.search()メソッドが付属していません。だから、最初に.toString();を使用して文字列を解析する方がよいでしょう。

関連する問題