【发布时间】:2015-06-13 18:24:51
【问题描述】:
我正在使用符合JSONAPI 的API,格式要求之一是所有数据(传入和传出)必须包装在data 对象中。所以我的请求看起来像:
{
"data": {
"email": "email@example.com",
"password": "pass",
"type": "sessions"
}
}
我的回复是这样的:
{
"data": {
"user_id": 13,
"expires": 7200,
"token": "gpKkNpSIzxrkYbQiYxc6us0yDeqRPNRb9Lo1YRMocyXnXbcwXlyedjPZi88yft3y"
}
}
在我的控制器中,当发出新的会话请求时,我有:
$scope.signin = ->
session = new Session
email: $scope.user.email
password: $scope.user.password
session.$save()
console.log session
console.log session.token
if not session.token
alert 'Invalid Login'
else
$rootScope.session_token = session.token
$state.go 'app.dashboard'
而我的Session 是一个看起来像这样的工厂:
angular.module('webapp').factory 'Session', [
'$resource'
($resource) ->
$resource 'http://localhost:9500/v1/sessions',
id: '@id'
,
save:
method: 'POST'
transformRequest: (data) ->
result =
data: JSON.parse JSON.stringify data
result.data.types = 'sessions'
result = JSON.stringify result
result
transformResponse: (data) ->
result = JSON.parse data
a = JSON.parse JSON.stringify result.data
console.log a
a
请求很好。格式化和解析似乎有效。但是,当我log 时,响应显示为Resource,而不是Object。即使服务器返回有效数据,session.token 也会显示为未定义。
如何修改我的transformResponse 来解决这个问题?
【问题讨论】:
-
嗯?
data: JSON.parse JSON.stringify data你为什么要这么做? -
您需要了解
session.$save()是异步的,因此console.log session.token将立即被调用并且在session.$save()请求得到解决之前始终未定义。 -
我也尝试使用
.then承诺,结果也一样 -
.then不会帮助您,除非您返回承诺。资源自动行为不同于承诺。 -
您的响应将作为资源记录,直到承诺得到解决。与
session.token相同,因为javascript 不会自动等待异步请求解决。请添加其余的资源定义。我意识到,我从未见过你从资源中返回什么。