angularjs自定义REST操作和错误处理

时间:2014-02-21 21:00:26

标签: angularjs postgresql rest error-handling flask

我在一个小的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发生了什么。

0 个答案:

没有答案