我使用expressJS实现的API将json作为正常响应返回,但是当发生错误时,只需调用r
即可返回带有纯文本的错误代码。
这导致我的前端出现问题,我使用了角度ngResoruce,资源代码是这样的:
res.sendStatus(401)
当返回正常的JSON数据时,这很好用,但是,当返回错误状态时,svc.authenticateApi = function() {
return $resource(apiEndpoint + 'authenticate', null, {
'save': {
method: 'POST',
transformResponse: function (data, header) {
console.log("transformResponse, header:", header());
console.log("transformResponse, data:", data);
return { data: angular.fromJson(data) };
},
},
});
};
参数不是序列化的JSON字符串,它是纯文本,我得到如下错误:
显然transformResponse尝试将文本data
解析为JSON并失败。我可以通过调用诸如`res.status(401).send({error:“Unauthorized”}之类的东西在服务器端发送每个错误响应来解决这个问题,但这感觉就像一个黑客,我不知道想要为每个状态代码手动重复错误文本。
有没有更好的方法来解决这个问题?我不希望它听起来像是一个咆哮,但ngResource文档真的很差,我开始认为使用$ http是一个更好的解决方案。
答案 0 :(得分:0)
我已经离开了$ resource并且到处都在使用$ http。我发现有关资源的一切都有点不稳定。我认为在所有场景中从服务器返回JSON听起来都是最好的方法。你可以实现一个自定义处理程序来测试你的传入响应来解决这个问题,但这对我来说并不是很合适。
我猜这个错误发生在return {data:angular.fromJson(data)};尽管如此。您也可以将它包装在try / catch中。
答案 1 :(得分:0)
我确实按照Mike Feltman的建议将fromJson
电话打包在try / catch
中。我们的想法是,如果出现错误,则无需费心转换响应。
function transformIgnoringErrors(original) {
var data;
try {
data = angular.fromJson(original);
/* code to perform transformation */
} catch (err) {
/* return what came in because no need to transform */
data = original;
}
return data;
}