2016-07-21 5 views
5

序文:は JSの約束がエラーオブジェクトを空にしているのはなぜですか?

  • 蛇腹見req.helpers.consoleMessage関数にして表示しないと判断することにいくつかの簡単なロジックを有する関数であるブルーバードを使用し、マングースの内部mpromiseを交換マングース
  • を使用

    • アプリケーション構成でオンになっているデバッグの存在と、表示されているオブジェクトの非ヌル/未定義状態に基づく特定のレベルの詳細。メッセージ全体はJSONを使用して文字列に変換され、コンソールに表示されます。

    コード:

    ここでは、これらの症状を示すいくつかのコードの例です。

    これは、私が取り組んでいるAPIの:team:commentユニットのdeleteルートです。私は意図的に、という行に、実際にはteamでなければならないときに、userというオブジェクトを参照している間違いを残しています。これは呼び出し関数から返され、Promise .then()に渡されるべきです。ユーザーが定義されていないため、参照エラーが発生するはずです。

    var console = clim("(DELETE /api/v1/team/:team/comments/:comment):", logger); 
    
        // create a filters request for mongoose 
        var query = {}; 
    
        // determine if the :team param is a username or an object id 
        req.helpers.validateObjectId(req.db, req.params.team) ? query._id = req.params.team : query.name = req.params.team; 
    
        if(req.helpers.validateObjectId(req.db, req.params.comment)) { 
    
         // looks good; create an update object 
         var update = { $pull: { comments: { _id: req.params.comment } } }; 
    
         // find the comment using the query above and pull the comment id 
         req.models.Team.findOneAndUpdate(
          query, 
          update, 
          {safe: true, new : true} 
         ).then(function(team){ 
    
          if(!team){ 
    
           // create the response object 
           var response = { 
            success: false, 
            message: "Team not found" 
           }; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with an appropriate array 
           res.status(404).json(response); 
    
          }else{ 
    
           // create the response object using the teams's comments 
           var response = user.comments; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with the team comments array 
           res.status(200).json(response); 
    
          } 
    
         }).then(null, function(err){ 
    
          // create the response 
          var response = { success: false, message: req.config.debug ? err: "An error has occur with your request; please try again" }; 
    
          // log the errors 
          console.error(req.helpers.consoleMessage(req, response, err)); 
    
          // or send a 500 internal server error 
          res.status(500).json(response); 
    
         }); 
    
        }else{ 
    
         // create the response 
         var response = { success: false, message: "Comment id is not a valid object id" }; 
    
         // log the errors 
         console.info(req.helpers.consoleMessage(req, response, null)); 
    
         // or send a 500 internal server error 
         res.status(500).json(response); 
    
        } 
    

    症状:

    はエラーを生成し、.catch()は、エラー状態から回復しようとする試みに発射するようになりますこのルートを呼び出すと、しかしerrオブジェクトは空のように見えます。

    Ex。 HTTP応答:{ success: false, message: {} }

    Ex。 (わかりやすくするために簡略)コンソールログ{ req: {...}, res: {...}. err: {} }

    結論:errオブジェクトが空のように見える

    ...

  • 答えて

    8

    問題:

    自体がコンソールにエラーオブジェクトのログオブジェクトが実際に空ではなく、err.messageなどのグラブプロパティは非常に実行可能であることが明らかになります。

    問題は、JSONを使用してJSエラーオブジェクトを素朴に文字列化できないことです。これは、この問題に対処する方法とともに、関連するSOF質問:Is it not possible to stringify an Error using JSON.stringify?に詳しく説明されています。

    更新されたコード:

    次のコード変更がメッセージHTTP応答およびヘルパー関数で示すことを指定するためになされた(前述の)エラーの詳細を示すために特定にアップデートされています:例:{ err: { message: err.message, stack: err.stack } }など。

    var console = clim("(DELETE /api/v1/team/:team/comments/:comment):", logger); 
    
        // create a filters request for mongoose 
        var query = {}; 
    
        // determine if the :team param is a username or an object id 
        req.helpers.validateObjectId(req.db, req.params.team) ? query._id = req.params.team : query.name = req.params.team; 
    
        if(req.helpers.validateObjectId(req.db, req.params.comment)) { 
    
         // looks good; create an update object 
         var update = { $pull: { comments: { _id: req.params.comment } } }; 
    
         // find the comment using the query above and pull the comment id 
         req.models.Team.findOneAndUpdate(
          query, 
          update, 
          {safe: true, new : true} 
         ).then(function(team){ 
    
          if(!team){ 
    
           // create the response object 
           var response = { 
            success: false, 
            message: "Team not found" 
           }; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with an appropriate array 
           res.status(404).json(response); 
    
          }else{ 
    
           // create the response object using the teams's comments 
           var response = team.comments; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with the team comments array 
           res.status(200).json(response); 
    
          } 
    
         }).then(null, function(err){ 
    
          // create the response 
          var response = { success: false, message: req.config.debug ? err.message : "An error has occur with your request; please try again" }; 
    
          // log the errors 
          console.error(req.helpers.consoleMessage(req, response, err)); 
    
          // or send a 500 internal server error 
          res.status(500).json(response); 
    
         }); 
    
        }else{ 
    
         // create the response 
         var response = { success: false, message: "Comment id is not a valid object id" }; 
    
         // log the errors 
         console.info(req.helpers.consoleMessage(req, response, null)); 
    
         // or send a 500 internal server error 
         res.status(500).json(response); 
    
        } 
    

    私はなぜこのような単純な概念を共有していますか?

    は、私は私の約束鎖構造を間違ってやっていたかを把握しようとしている時間を検索したキーワードemptyerrorを使用(JSの約束に関する単語のすべての組み合わせと一緒に)私の検索では、誰も思い付いたん私がこれに正しく近づいていたことを確認する以外には役に立ちました。私の助けを借りてすべてがうまくいくように見えて、errオブジェクトをコンソールに直接出力しようとするまで問題がどこにあるかを把握するための正しいデバッグステップを実行できないようでした(なぜこれを行う必要がありますか?私はすでに...だったので...)。

    誰かが似たような状況に陥って「なぜ私の約束が意図したとおりに働いていないのですか」と思っている人もいるかもしれません。私と同じように、間違った方向に向かって検索しています。

    ハッピーコーディング!

    +0

    Cool!分かち合いありがとうございます。 – danilodeveloper

    +2

    ハ、私はまったく同じ間違いをしました。これは私にとって今日のスタックオーバーフローで最も有用なものです。ありがとう。 – jlegler

    関連する問題