背景
我使用visionmedia / superagent访问我的REST API。该API目前在不同的域上可用,并且具有CORS设置以允许来自我的客户端的跨域请求。为了安全地访问API,我传递了一个带有访问令牌的Authorization标头。令牌的生命周期很短,当它到期时,我可以使用刷新令牌请求新的令牌。当访问令牌过期时,服务器将回复401错误,告诉我该请求是未授权的。
问题
我试图用superagent捕获401 Unauthorized请求,然后处理令牌刷新。问题是superagent没有为401返回标准响应或错误。我得到一个字符串响应而不是一个对象。
错误回复
Error: Request has been terminated
Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.
at Request.crossDomainError (client.js:616)
at XMLHttpRequest.xhr.onreadystatechange (client.js:724)
拨打
ajax.get(api.baseURL + '/some_request)
.accept('application/json')
.set('Content-Type', 'application/json')
.set('Authorization', 'Bearer ' + this.getAccessToken())
.send({...})
.then((sucess) => {
//handle success, update data
})
.catch((error) => {
//handle error, if 401 refresh the token and try again.
});
其他信息
服务器成功处理CORS端的事情,初始OPTIONS请求成功返回200。
我尝试使用非ES6 .end((error, response) => {...}
方法来处理具有相同结果的响应。
我使用的是superagent版本" 3.4.0"
我试过捕获错误事件,得到相同的错误字符串。
.on('response', (error, response) => {
//manage error
})
.on('error', function(err) {
//manage error
})
我的服务器401响应有一个json响应正文,并返回Content-Type:application/json; charset=UTF-8
标题
{
"name":"Unauthorized",
"message":"You are requesting with an invalid credential.",
"code":0,
"status":401,
"type":"yii\\web\\UnauthorizedHttpException"
}
问题
要获取401响应的错误对象,我需要做什么?我希望能够检查error.status
以查看它是否为401,以便我可以刷新令牌?