我在一个小的angularjs应用程序中遇到了一些错误处理问题。我正在与Flask后端和Postgres DB进行交互。
我有工厂服务
appointServices.factory('Appointments', ['$resource', function($resource){
return $resource(someUrl, {}, {
query: { ... }
,
create: {
method: 'POST'
,url: 'http://somedomain:port/new/:name/:start/:end/:treatment'
,params: { start: '@start', end: '@end', name: '@name', treatment: '@treatment' }
,isArray:false
}
});
}
]);
在控制器内我正在进行以下调用
Appointments.create($scope.appointment, function(value, responseHeaders) {
// success handler
console.debug('success: ', JSON.stringify(value));
}, function(httpResponse) {
// error handler
console.debug('error: ', JSON.stringify(httpResponse));
});
此处$scope.appointment
包含create
操作的相关参数。
现在,在后端我能够捕获涉及约束的DB错误,并且我试图返回带有“有意义”消息的错误代码。所以我有一个python方法
def create(name, start, end, treatment):
try:
...
transaction_status = 'ok'
code = 200
except IntegrityError as e:
...
transaction_status = 'IntegrityError'
code = 500
finally:
...
return make_response(transaction_status, code)
一切正常,我能够与后端交谈,创建新数据并将其插入数据库中。正如我所说,检测到任何违反约束的行为,并且后端响应
curl -X POST "http://somedomain:port/new/foo/bar/baz/qux" -v
...
< HTTP/1.0 500 INTERNAL SERVER ERROR
...
IntegrityError
所以,问题是,无论动作create
是否成功,控制器内指定的预期错误处理程序总是被触发。此外,我总是在404
中获得状态代码httpResponse
。然而,Firebug正确显示了上面的代码500
。
任何人都知道我为什么会这样做? 关于如何改进错误处理机制的任何建议也是受欢迎的。 Thx提前。
P.S。关于$resource的文档,我还尝试了工厂服务调用的变体,例如
Appointments.create({}, $scope.appointment, successCallback, errorCallback);
Appointments.create($scope.appointment, {}, successCallback, errorCallback);
具有相同的结果。
更新:
忘了提到我通过CORS请求与后端进行交互的重要事实。上面POST
中的create
请求代之以OPTIONS
方法。正如我所提到的,除错误响应外,一切正常。
根据进一步的调查,我试图隔离工厂服务,以防我做错了,我也尝试了信用卡示例($resource
docs)中显示的方法,但没有给出积极的结果。< / p>
然而,我想出了两个解决方法。首先,我能够创建一个简单的 JQuery POST
请求,就像文档中显示的example一样。这次,请求被OPTIONS
替换,我正确地得到了错误代码。
我还设法使用低级$http
服务连接到后端,如下所示:
var urlBase = 'http://somedomain:port/new/:name/:start/:end/:treatment';
var url = urlBase.replace(/:name/g, $scope.appointment.name);
url = url.replace(/:start/g, $scope.appointment.start);
url = url.replace(/:end/g, $scope.appointment.end);
url = url.replace(/:treatment/g, $scope.appointment.treatment);
// force method to be POST
var futureResponse = $http({ method: 'POST', url: url });
futureResponse.success(function (data, status, headers, config) {
console.debug('success: ', JSON.stringify(data));
});
futureResponse.error(function (data, status, headers, config) {
console.group('Error');
console.debug(JSON.stringify(status));
console.debug(JSON.stringify(data));
console.groupEnd();
});
这次,与JQuery的情况一样,使用POST
有效地完成了请求,并且正确接收了错误代码。
另请注意,我不调用$http.post
但我将方法设置为POST
作为$http
的对象参数的一部分,否则连接使用OPTIONS
之前的地方。
仍然试图弄清楚$resource
发生了什么。