角度$http优雅地处理错误


angular $http gracefully handling errors

有人可以提供有关$http如何与 JSON 相关的背景信息,它是检测输出格式并在成功后自动将其转换为 JSON 还是我必须手动处理?

如果这是默认行为,如果无法将输出转换为 JSON 会发生什么?

上下文:在这种情况下,我的 Web 服务由于 sql 连接错误而失败,但仍success被调用

我的$http相关代码序列:

    this.$http.defaults.headers.common["Accept"] = "application/json";
    this.$http.get(common.Config.getEndPoint() + "/sync", {params:params})
        .success(function(data, status, headers, config) {
            self.onResult(data);
        })
        .error(function(data, status, headers, config){
            console.log(data)
        });

错误 - (因为我的 mySQL 服务器没有运行,这可以修复,但我的目标是在发生这种情况时在前端优雅地处理此错误,在后端和前端寻找一个好的策略(

SQLSTATE[HY000] [2002] Connection refused<br />
<b>Fatal error</b>:  Call to a member function prepare() on a non-object in 

生成错误的 PHP 行

$statement = $this->connection->prepare("SELECT id, username, password FROM `user` WHERE username = :username AND suspended = 0 AND deleted = 0");

学习:成功适用于任何 2xx 状态代码,而错误针对任何 1xx、3xx、4xx 和 5xx

运行

问题是返回的成功状态代码没有有效的 JSON 数据。这是由于您的 API 返回了不正确的状态代码。如果您想实际解决问题,则应在 API 中解决此问题:

if db is down
    return 503 or something.

否则,您可以在成功回调中检查状态代码:

this.$http.get(common.Config.getEndPoint() + "/sync", {params:params})
    .success(function(data, status, headers, config) {
        if (status starts with 2)
            self.onResult(data);
    })
    .error(function(data, status, headers, config){
        console.log(data)
    });

但这不是正确的解决方法。你的游戏要求一种优雅的方式来处理错误,而第二种方法不是优雅的。

还要注意那里的伪代码(我忘记了状态是字符串还是数字(。