2016-06-02 18 views
1

に$ HTTP呼び出しをでキャッチし、私は私のノードのバックエンドは、次のエンドポイントを持っている:使用/角度

usersRoute.get('/get', function(req, res) { 

    //If no date was passed in - just use todays date 

    var date = req.query.date || dateFormat(new Date(), 'yyyy-mm-dd'), 
     search = req.query.search; 

    users.getAllUsers(date, search) 
     .then(function(results) { 
      res.json(results); 
     }, function(err) { 
      res.status(500).json({ 
       success: false, 
       message: 'Server error.', 
       data: [] 
      }); 
     }); 
}); 

私はfunction(err){}一部

をトリガするために何か他のものに私のSQLテーブル名を変更しました私は私のサービスでこれを使用すると

が、それは次のようになります。http status code 500を返しますサーバーを知る

function getUsers(date, search) { 
      return $http.get('/api/users/get', { 
       params: { 
        date: UtilsService.formatDate(date), 
        search: search 
       } 
      }) 
      .then(getData) 
      .catch(handleErr); 

      function getData(response) { 
       return response.data; 
      } 

      function handleErr(err) { 
       LoggerService.error('Could not retrieve users.', err ,'Ooops'); 
      } 
     } 

が、私はそれがに右に行くだろうと思いました10。

function getUsers(date, search) { 
      isAdmin(); 

      vm.loading = true; 
      vm.filteredUsers = []; 

      return UsersService.getUsers(date, search).then(function(data) { 
       vm.loading = false; 

       allUsers = data || []; 
       vm.filteredUsers = allUsers.slice(0, 50); 
       vm.distribution = UsersService.getDistribution(allUsers); 

       return vm.filteredUsers; 
      }); 
     } 

then部分は私のserviceにトリガされるので、私の問題は、次のとおりです。しかし、それはまた、私はこのように私のコントローラで私のサービスを利用then block

undefinedあるデータを/返します。私はスライスしようとしていますundefined

私の質問は次のとおりです。このようなパターンについては、どのようなベストプラクティスですか?

+1

あなたのサーバーは500で応答していますか?それは間違いなくキャッチを引き起こすはずですから。 –

+0

@FabioAntunes少し質問を編集します。キャッチがトリガーされるだけでなく、 'その後の部分'もトリガーされます。 –

+0

今私はそれを得る、私はあなたのための解決策を持っている –

答えて

2

をその

function getUsers(date, search, cb) { 
     return $http.get('/api/users/get', { 
      params: { 
       date: UtilsService.formatDate(date), 
       search: search 
      } 
     }) 
     .then(cb) 
     .catch(handleErr); 

     function handleErr(err) { 
      LoggerService.error('Could not retrieve users.', err ,'Ooops'); 
     } 
} 

ような何かをしてから、コントローラに可能性の問題は、あなたがあなたのAPIからのエラーをキャッチして、.catchによって作成された約束を返すということです。

クイック例

promise.then(function(data) { 
    throw 'Some error'; 
}).catch(function (err) { 
    console.log(err) // will output 'Some error' 
}).then(function() { 
    // This will run even though we have a catch before 
}); 

、どのように我々はそれがだからあなたの場合には次の2つのオプション、1つのスローを持って、我々は.catch

promise.then(function(data) { 
    throw 'Some error'; 
}).catch(function (err) { 
    console.log(err) // will output 'Some error' 
    throw 'You shall not pass' 
}).then(function() { 
    // This will not run 
}); 

内のエラーを投げるのは簡単です.thenを防ぐことができます私が言ったようにエラーが出るか、またはサービスにサービスを注入してください:

function getUsers(date, search) { 
    return $http.get('/api/users/get', { 
     params: { 
      date: UtilsService.formatDate(date), 
      search: search 
     } 
    }) 
    .then(getData) 
    .catch(handleErr); 

    function getData(response) { 
     return response.data; 
    } 

    function handleErr(err) { 
     LoggerService.error('Could not retrieve users.', err ,'Ooops'); 
     return $q.reject(err); 
    } 
} 
+0

ありがとう!ただ一つの質問。私はあなたに$ qを使って2番目のオプションを使いました。それはまだ 'then'に入り、私に '未定義のプロパティ 'データ'を読み取れません。 –

+0

@ Nilzone-私はすべてがうまくいくのを見ることができるプランナーを作成しました。 p = preview –

+1

あなたは絶対に正しいです。私はおそらく何かを逃した。私は今日後で詳しく見ていきます。この例をありがとう! :) –

0

あなたは

UsersService.getUsers(date, search, function(data) { 
     vm.loading = false; 

     allUsers = data || []; 
     vm.filteredUsers = allUsers.slice(0, 50); 
     vm.distribution = UsersService.getDistribution(allUsers); 
    }); 
+0

今はキャッチが全く呼び出されていないようです。 –

関連する問題