2016-08-31 7 views
-1

Angular JSのMongoDBでドキュメントを削除または更新する際にエラーを処理する方法を理解しようとしていますか?ExpressでMongoDBデータベースの更新/削除から角型コントローラのエラーを処理するには?

私はノード/ Expressの次のルートを持っている:

function handleError(res, reason, message, code) { 

    console.log("ERROR: " + reason); 
    //log the reason for the error 
    res.status(code || 500).json({ 
     "error": message 
    }); 

    } 

app.delete("/polls/:id", auth, function(req, res) { 

    db.collection(POLLS_COLLECTION).deleteOne({ 
     _id: new ObjectID(req.params.id), userID: req.user.id 
     //userID must match the req.user.id from Passport to make sure the poll belongs to the user 
    }, function(err, doc) { 

     if (err) { 

     handleError(res, err.message, "Failed to delete poll"); 

     } else { 

     res.status(204).end(); 

     } 


    }); 


    }); 

角度JSコントローラで次のコントローラで

$scope.deleteThisPoll = function(){ 

      Polls.deletePoll($routeParams.pollId) 

      .then(function(response){ 

        alert("Poll deleted!"); 

        var url = "/mypolls/" + $scope.userID; 

        $location.path(url); 

       }, function(response){ 

        alert("Error deleting poll"); 

        console.log(response); 

       }) 

     }; 

deleteThisPollはにAA要求を送信deletePollサービスを呼び出しますルート:

this.deletePoll = function(pollId){ 

     var url = "/polls/" + pollId; 

     return $http.delete(url); 


    }; 

「エラーを削除しています」というメッセージが表示されます。frデータベースの削除が実行されない場合(ユーザーが認証されていないか、または投票がユーザーに属していないため)、削除が成功した場合は "Poll Deleted"のAngularコントローラを使用します。

ただし、エラーコールバックは一度も使用されず、アプリは常に「ポーリングを削除しました」と警告します。文書が削除されたかどうかに関係なく、削除されます。

削除が実行されなかったときに私のルートからエラー応答が送信されず、角度エラーコールバックが発生しませんか?あなたの角度JSコントローラで

<div style="color:red;"> 
{{error}} 
</div> 

$scope.deleteThisPoll = function(){ 

     Polls.deletePoll($routeParams.pollId) 

     .then(function(response){ 

       alert("Poll deleted!"); 

       var url = "/mypolls/" + $scope.userID; 

       $location.path(url); 

      }, function(response){ 

       $scope.error="Any error message you like to show"; 

       console.log(response); 

      }) 

    }; 
+0

あなたのルートはhttpエラーを送信しないと思います。 fiddlerを使用してレスポンスAPIを視覚化します。 APIがHTTPエラーを返す場合は、私の例からエラーをキャッチしてください。 –

+0

right _idとuserIDのドキュメントが見つからない場合、削除/更新はありませんが、エラーとはみなされません。そのような場合には私は応答を送る必要がありますか? – chemook78

+0

httpコード(http://www.restapitutorial.com/httpstatuscodes.html)がたくさんあります。あなたの場合は、404エラーを使用する必要があります。そして、角度コードで特定のアクションを実行する必要があります。 –

答えて

0

エラー。あなたはこのようにキャッチすることができます:

Polls.deletePoll($routeParams.pollId).then(function(response) { 

    //SUCCESS CODE 

}).catch(function(error) { 
    //NOTIFY ERROR 
    //NotifyService.display(error); 
    console.log(error); 
}); 
0

あなたのAPIリターン場合は、エラーメッセージを表示したい、このHTMLコードを入れ

以下のコードのように行うことができます

+0

は、私の関数のエラーコールバックと同じではないか、キャッチメソッドとの違いがありますか? – chemook78

+0

いいえ、それは本当に同じではありません。あなたの成功コードがエラーをスローすると、catchメソッドからエラーをキャッチできます。 –

0

ありがとうございます。何らかの理由でMongoDBが削除/更新がなくても常に結果オブジェクトを返すことがわかりました。私はそうのように1または0に設定されてresult.deletedCountのpropetyをチェックすることでこれを解決:

if(err){ 

    res.status(500).end(); 

    } 

    if(result.deletedCount === 0){ 

    res.status(404).end(); 
    //error handling in Angular error callback 

    } else { 

    res.status(204).end(); 
    //error handling in Angular success callback 
    } 


}); 

}); 

これは常に204は、削除が成功したかどうかを送っているではないことを確認します。

+0

[あなた自身の回答を受け入れる]ことができますか(http://blog.stackoverflow.com/2009/01/accept-your-own-answers/)? – chridam

関連する問題