【问题标题】:Unexpected token , in Angular code after $http request意外的令牌,在 $http 请求后的 Angular 代码中
【发布时间】:2014-09-05 02:57:38
【问题描述】:

我正在使用下面的代码向我的服务器提交一个 $http 请求,但突然 Angular 在某处抱怨“意外令牌”。

function sendAggrRequestToServer(url) {
        var deferred = $q.defer();
        $http({
            method: 'GET',
            encoding: 'JSON',
            headers: {
                'Access-Control-Allow-Origin': 'true'
            },
            withCredentials: true,
            url: url
        }).success(function (data, status, headers, config) {
            var retval = data;
            deferred.resolve(retval);
        }).error(function (data, status, headers, config) {
            logErr("Error submitting aggregation request to server: " + status);
        });
        return deferred.promise;
    }

奇怪的是,这个确切的 URL 在浏览器和 Fiddler 中都能成功运行。并且 Json 数据按预期返回。但是,出于某种奇怪的原因,我的 javascript 代码抛出了这个 例外:

   [app]  [HT Error] Unexpected token , 
     Object {exception: SyntaxError, cause: undefined}
     angular.js:9778
     (anonymous function) angular.js:9778
     logIt logger.js:55
     logError logger.js:49
     (anonymous function) logger.js:32
     (anonymous function) config.exceptionHandler.js:26
     deferred.promise.then.wrappedCallback angular.js:11322
     (anonymous function) angular.js:11405
     Scope.$eval angular.js:12412
     Scope.$digest angular.js:12224
     Scope.$apply angular.js:12516
   done angular.js:8204
   completeRequest angular.js:8412
   xhr.onreadystatechange

我的网址是:

 http://localhost:49479/api/aggr?sid=9630a8040ee6c901a4034c07894abc317272f855c757a4c60a6a&kri=[CDSStress%20A]:[USD%2010Y%20X%20-1.25],[CDSStress%20A]:[USD%2010Y%20X%201.25]&aggrFunc=SUM([CDSStress%20A]:[USD%2010Y%20X%20-1.25]),SUM([CDSStress%20A]:[USD%2010Y%20X%201.25])&dim=Counterparty

仅供参考:此时 angular.js 中的一切似乎都很好,我确实可以看到响应数据(这绝对是有效的 Json 数据)。回调状态参数的值为“200”,statusText 为“OK”:

function completeRequest(callback, status, response, headersString, statusText) {
  // cancel timeout and subsequent timeout promise resolution
  timeoutId && $browserDefer.cancel(timeoutId);
  jsonpDone = xhr = null;

  // fix status code when it is 0 (0 status is undocumented).
  // Occurs when accessing file resources or on Android 4.1 stock browser
  // while retrieving files from application cache.
  if (status === 0) {
    status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;
  }

  // normalize IE bug (http://bugs.jquery.com/ticket/1450)
  status = status === 1223 ? 204 : status;
  statusText = statusText || '';

  callback(status, response, headersString, statusText);
  $browser.$$completeOutstandingRequest(noop);
}

};

这是断点的屏幕图像,我可以在其中检查“响应”参数:

但是,一旦它解决了 promise 并返回到我的调用函数,angular 就会抛出 Unexpected token 错误。

我已经用了好几天了,但今天我一定是介绍了一些东西来导致这个。我就是想不通!

非常感谢您的建议和指导。

问候。

鲍勃

更新:

我现在发现 Angular 在这一行的 $HttpProvider() 中抛出了实际异常:

  data = fromJson(data);

这里:

function $HttpProvider() {
  var JSON_START = /^\s*(\[|\{[^\{])/,
  JSON_END = /[\}\]]\s*$/,
  PROTECTION_PREFIX = /^\)\]\}',?\n/,
  CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'};

   var defaults = this.defaults = {
  // transform incoming response data
 transformResponse: [function(data) {
  if (isString(data)) {
    // strip json vulnerability protection prefix
    data = data.replace(PROTECTION_PREFIX, '');
    if (JSON_START.test(data) && JSON_END.test(data))
      data = fromJson(data);
  }
  return data;
}],

 // transform outgoing request data
 transformRequest: [function(d) {
   return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
 }],

 // default headers
 headers: {
  common: {
    'Accept': 'application/json, text/plain, */*'
  },
  post:   copy(CONTENT_TYPE_APPLICATION_JSON),
  put:    copy(CONTENT_TYPE_APPLICATION_JSON),
  patch:  copy(CONTENT_TYPE_APPLICATION_JSON)
 },

 xsrfCookieName: 'XSRF-TOKEN',
 xsrfHeaderName: 'X-XSRF-TOKEN'
 };

从这里调用 sendAggregationREquest() :

  function buildAndSendAggregationQuery() {
        // iterate list in reportsContext , pass data to to sendAggregationRequest()            


        var userKRIs = vm.kriUserDataSource.get();
        userKRIs.load();
        var group;
        var kri = '';
        var aggrFunc = '';
        var aggrKriFuncArray;
        var dimension = vm.selectedDimen;
        var dimenMulti = '';

        var applyScenarioAggr = false;
        if (vm.kriUserDataSource.data()[0].group == '99_HSVaR') {
            applyScenarioAggr = true;
        }

        // Call function to build the aggr function. Return value is an array.
        if (applyScenarioAggr) {
            aggrKriFuncArray = reportsContext.buildAggrFunc(vm.kriUserDataSource.data(), 'AVERAGE');
        }
        else {
            aggrKriFuncArray = reportsContext.buildAggrFunc(vm.kriUserDataSource.data(), 'SUM');
        }
        kri = aggrKriFuncArray[0];
        aggrFunc = aggrKriFuncArray[1];

        for (var i = 0; i < vm.multiSelectedDimen.length; i++) {
            dimenMulti += vm.multiSelectedDimen[i] + ',';
        }
        dimenMulti = dimenMulti.substr(0, dimenMulti.length - 1);  // ' remove final ","

        sendAggregationRequest(kri, aggrFunc, dimension);       //dimenMulti);
    }

最后,在该异常之前从服务器返回的响应数据:

   {"status":"SUCCESS", "messages":[], "data":[{"attributes":[{"name":"Counterparty","type":"string"},{"name":"SUM(CDSStress A:USD 10Y X -1.25)","type":"double"},{"name":"SUM(CDSStress A:USD 10Y X 1.25)","type":"double"}],"rows":[{"id":0,"values":["Goldman",0.,0.]},{"id":1,"values":["IBM",0.,0.]},{"id":2,"values":["JP Chase",0.,0.]},{"id":3,"values":["MINESCONDIDA",0.,0.]},{"id":4,"values":["Merrill",0.,0.]},{"id":5,"values":["Nokia",0.,0.]},{"id":6,"values":["Pequot",0.,0.]},{"id":7,"values":["Pimco Fund A",0.,0.]},{"id":8,"values":["Pimco Fund B",0.,0.]},{"id":9,"values":["Deutsche",0.,0.]},{"id":10,"values":["Ditech",0.,0.]},{"id":11,"values":["GM Isuzu",0.,0.]},{"id":12,"values":["GM Opel",0.,0.]},{"id":13,"values":["GMAC",0.,0.]},{"id":14,"values":["GMAC Insurance",0.,0.]},{"id":15,"values":["GSAM",0.,0.]},{"id":16,"values":["General Insurance",0.,0.]},{"id":17,"values":["Genworth",0.,0.]},{"id":18,"values":["AIG",0.,0.]},{"id":19,"values":["Andor",0.,0.]},{"id":20,"values":["BARCLAYS",92.7731197209214,-10.1717767200607]},{"id":21,"values":["BHHSH",0.,0.]},{"id":22,"values":["BHPBFIN",0.,0.]},{"id":23,"values":["BHPSTEEUR",1468.80370935,-161.395632863801]},{"id":24,"values":["BHPSUS",0.,0.]},{"id":25,"values":["BLUESCOPEFIN",0.,0.]},{"id":26,"values":["CSFB",3.35029024626419,-0.367366071961442]},{"id":27,"values":["BLOSOFL",0.,0.]},{"id":28,"values":["GRMOBND",0.,0.]}]}]}

【问题讨论】:

  • 能贴出调用函数吗?
  • 你的意思是调用sendAggregationRequest()的函数?
  • 是的,告诉我们 sendAggrRequestToServer 的调用位置

标签: angularjs


【解决方案1】:

你能做一个 jsfiddle 吗?或者至少向我们展示您如何调用 sendAggrRequestToServer 方法。 应该是

var promise = sendAggrRequestToServer(url);
  promise.then(function(data) {
    console.log('Success we got: ' + data);
  }, function(reason) {
    console.log('Failed we got: ' + reason);
  }, function(update) {
    console.log('Strange we got: ' + update);
  });

谢谢

【讨论】:

  • 我无法真正制作 jsfiddler,因为我有一个正在运行的服务器来处理我的请求。
  • 肯定是Json响应有问题。我刚刚在jsonlint.com 验证了它
  • 我同意您的 JSon 数据。但是您知道如果您使用特定的 url /echo/json/ ,您可以构建一个 jsfiddle 示例来回显您通过 $http.get 发送的数据吗?这样,您就可以像远程服务器回复您在呼叫中发送的数据一样。
  • 我需要研究如何使用 /echo/json。这听起来像是一个有用的资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2016-12-30
  • 2021-08-05
  • 2023-03-27
相关资源
最近更新 更多