Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ngResource transformResponse如何处理错误和正常数据_Javascript_Angularjs_Ngresource - Fatal编程技术网

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

Javascript ngResource transformResponse如何处理错误和正常数据,javascript,angularjs,ngresource,Javascript,Angularjs,Ngresource,使用expressJS实现的API返回json作为正常响应,但当发生错误时,只需调用res.sendStatus(401),即可返回带有纯文本的错误代码 这导致我的前端出现问题,我使用angular Ngressure,资源代码如下: svc.authenticateApi = function() { return $resource(apiEndpoint + 'authenticate', null, { 'save': {

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

这导致我的前端出现问题,我使用angular Ngressure,资源代码如下:

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字符串,它是纯文本,我得到如下错误:

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) };
                    },
                },
            });
        };

transformResponse试图将未经授权的文本解析为JSON,但失败了。我可以通过在服务器端调用类似`res.status(401).send({error:“unauthorized”})之类的东西,将每个错误响应作为JSON发送来解决这个问题,但这感觉像是一种黑客行为,我不想手动为每个状态代码重复错误文本


有没有更好的方法来处理这个问题?我不想让它听起来像是一句废话,但ngResource文档真的很差,我开始认为使用$http是一个更好的解决方案。

我已经从$resource转移到其他地方,到处使用$http。我只是觉得$resource的所有内容都有点不可靠。我确实认为从服务器返回JSON需要一段时间不过,ll场景听起来是最好的方法。你可以实现一个自定义处理程序来测试传入的响应,以解决这个问题,但我觉得这不太合适


我猜错误发生在返回{data:angular.fromJson(data)}上;行。你也可以用try/catch来包装它。

我已经离开$resource,到处使用$http。我只是觉得$resource的一切都有点不可靠。我确实认为在所有情况下从服务器返回JSON听起来都是最好的方法。不过,你可以实现一个自定义处理程序来测试传入的响应我很想解决这个问题,但我觉得这不太合适


我猜错误发生在返回{data:angular.fromJson(data)}上;行。你也可以用try/catch来包装它。

根据Mike Feltman的建议,我成功地将来自JSON的
调用包装成
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;
}

Mike Feltman建议将来自JSON的
调用封装在
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;
}