ngResource transformResponse 如何同时处理错误和正常数据

ngResource transformResponse how to handle both error and normal data

我的 API 用 expressJS returns json 实现作为正常响应,但是当发生错误时,returns 错误代码带有纯文本,只需调用 res.sendStatus(401).

这导致我的前端出现问题,我使用angular ngResoruce,资源代码是这样的:

svc.authenticateApi = function() {
            return $resource(apiEndpoint + 'authenticate', null, {
                'save': {
                    method: 'POST',
                    transformResponse: function (data, header) {
                        console.log("transformResponse, header:", header());
                        console.log("transformResponse, data:", data);

                        return { data: angular.fromJson(data) };
                    },
                },
            });
        };

这在返回正常 JSON 数据时工作正常,但是,当返回错误状态时,data 参数不是序列化的 JSON 字符串,它是纯文本,并且我收到这样的错误:

显然 transformResponse 尝试将文本 Unauthorised 解析为 JSON 但失败了。我可以通过调用类似 `res.status(401).send({error: "Unauthorised"} 的方法在服务器端将每个错误响应作为 JSON 发送来解决这个问题,但这感觉就像一个 hack,我不想为每个状态代码手动重复错误文本。

有没有更好的方法来处理这个问题?我不希望这听起来像是在咆哮,但 ngResource 文档真的很差,我开始认为使用 $http 是一个更好的解决方案。

我已经离开 $resource 并在所有地方使用 $http。我只是发现有关 $resource 的所有内容都有些古怪。我确实认为在所有情况下从服务器 returning JSON 听起来是最好的方法。您可以实现一个自定义处理程序来测试您的传入响应以解决此问题,但我觉得这并不合适。

我猜错误发生在 return { data: angular.fromJson(data) };虽然行。您也可以将其包装在 try/catch 中。

按照 Mike Feltman 的建议将 fromJson 调用包装在 try / catch 中,我确实取得了成功。这个想法是,如果有错误,则无需费心转换响应。

function transformIgnoringErrors(original) {
    var data;

    try {
        data = angular.fromJson(original);
        /* code to perform transformation */
    } catch (err) {
        /* return what came in because no need to transform */
        data = original;
    }
    return data;
}