【问题标题】:How to get status code in Angularjs?如何在 Angularjs 中获取状态码?
【发布时间】:2017-04-12 20:43:57
【问题描述】:

我们使用 aws 和 swagger,我们也有一个带有 getData 方法的服务

var getData = () => {
    return $http({
        method: 'GET',
        url: 'myURL',
        headers: {
            'Authorization': 'token'
        }
    });
};

我正在尝试将它与下面的代码一起使用

dataservice.getData().then(response => {
                    console.log(response)
                })
                .catch((err) => {
                    console.log(err));
                })

并且对于良好的请求(当我被自动化时)它工作正常,我得到了我的数据,但是令牌无效我在控制台中遇到错误,而状态代码却没有

Object {data: null, status: -1, config: Object, statusText: "", headers: function}  

swagger返回下面图片

我的目标是获得状态码 401“未自动”

我们的lamba具有波纹管结构

exports.handler =  (event, context, callback) => {
    var token = event.authorizationToken;
    // Call oauth provider, crack jwt token, etc.
    // In this example, the token is treated as the status for simplicity.

    switch (token.toLowerCase()) {
        case 'allow':
            callback(null, generatePolicy('user', 'Allow', event.methodArn));
            break;
        case 'deny':
            callback(null, generatePolicy('user', 'Deny', event.methodArn));
            break;
        case 'unauthorized':
            callback("Unauthorized");   // Return a 401 Unauthorized response
            break;
        default:
            callback("Error: Invalid token"); 
    }
};

我们从awsdoc得到这个

【问题讨论】:

  • 你的控制台应该还有其他一些错误信息,那是什么错误
  • 你应该处理这个服务器端发送 401 状态以及错误
  • 你能举个例子吗?
  • 这里链接到我目前遇到的错误prntscr.com/ev2ydi
  • 发布您的服务器端代码,为了帮助您,我们必须了解您如何管理您的“myURL”端点。

标签: angularjs node.js amazon-web-services swagger aws-lambda


【解决方案1】:

catch() 中,您可以访问包含statusdata 的错误对象,从中可以阅读有关失败原因的其他信息。

angular.module('app', []).service('someService', function($http) {
  const getData = () => {
    return $http({
      method: 'GET',
      url: 'myURL',
      headers: {
        'Authorization': 'token'
      }
    });
  };

  return {
    getData
  }
})

describe('Some service', function() {

  let someService, $httpBackend

  beforeEach(module('app'))

  beforeEach(inject((_someService_, _$httpBackend_) => {
    someService = _someService_
    $httpBackend = _$httpBackend_
  }))

  it('returns 401 status', () => {
    const message = {reason: 'some reason'}
  
    $httpBackend.whenGET('myURL').respond(401, { message })

    someService.getData().then((response) => {
      expect(response).toBeUndefined()
    }).catch(function(error) {
      expect(error.status).toBe(401)
      expect(error.data.message).toEqual(message)
    })

    $httpBackend.flush()
  })

})
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/jasmine.css"></link>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/jasmine.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/jasmine-html.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/boot.js"></script>
<script src="//code.angularjs.org/snapshot/angular.min.js"></script>
<script src="//code.angularjs.org/snapshot/angular-mocks.js"></script>

【讨论】:

  • 我无法使用$httpBackend.whenGET,因为我必须使用已经创建的api
  • $httpBackend 用于测试目的,请勿尝试将其与生产代码一起使用
【解决方案2】:

请尝试

.success(function (response) {
 if (response.token){

 }
else{
 // do else case
}
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多