Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular http.get-如何正确捕获404_Angular_Http_Error Handling_Http Status Code 404 - Fatal编程技术网

Angular http.get-如何正确捕获404

Angular http.get-如何正确捕获404,angular,http,error-handling,http-status-code-404,Angular,Http,Error Handling,Http Status Code 404,我正在构建一个日历应用程序,从(当前模拟的)后端获取每天的数据。 在http.get的正确url上,这可以正常工作,但是如果url错误,或者请求的一天的后端没有数据/json对象(例如,周末没有任何数据),我(显然)得到了404,尽管控制台中的日志很少显示它,但它总是给我以下错误: SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data 显然,它不能有预期的字符,因为请求的日期不存在Js

我正在构建一个日历应用程序,从(当前模拟的)后端获取每天的数据。 在http.get的正确url上,这可以正常工作,但是如果url错误,或者请求的一天的后端没有数据/json对象(例如,周末没有任何数据),我(显然)得到了404,尽管控制台中的日志很少显示它,但它总是给我以下错误:

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
显然,它不能有预期的字符,因为请求的日期不存在Json对象。检查网络分析表明,这确实是一个404错误

我在这里使用基本的http.get和handleError

使用http.get的服务的代码:

getDayInfo(date: string): Observable<any> {
  return this.gttp.get('somepath/' + date + '/somemoreinfo')
    .map(this.extractData, // works just fine
         console.log('map running for date: ', date)
    ) 
    .catch(this.handleError);
}

private extractData(res: Response) {
  if (res != null) {
    let body = res.json();;
    return body;
  } else { // else return an empty dummy json, doesn't really work here
    return '[{"id": "", "userId": "", "userName": "", "type": { "name": "" }, "date": {' +
    '"startDate": "", "endDate": "", "startTime": "", "endTime": "" }   }]'; }
}

private handleError(error: Response | any) {
  console.log('Errorhandling triggered'); 
  let errMsg: string;
  if (error instanceof Response) {
    console.log('Errorhandling if-block'); // this triggers on a 404
    const body = error.json() || '';
    const err = body.error || JSON.stringify(body);
    errMsg = `${error.status} - ${error.statusText || '' } ${err}`;
  } else {
    errMsg = error.message ? error.message : error.toString();
  }
  console.error('Error ', errMsg); // this never appears in the log though
  return Observable.throw(errMsg);
}
getDayInfo(日期:字符串):可观察{
返回此.gttp.get('somepath/'+date+'/somemoreinfo'))
.map(this.extractData,//工作正常
log('map running for date:',date)
) 
.接住(这个.把手错误);
}
私有数据(res:Response){
如果(res!=null){
让body=res.json();;
返回体;
}else{//else返回一个空的伪json,在这里不起作用
返回“[{”id:“,”userId:“,”userName:“,”type:“{”name:“}”,date:{”+
“开始日期”:“结束日期”:“开始时间”:“结束时间”:“}}];}
}
私有句柄错误(错误:响应|任意){
console.log('Errorhandling triggered');
让errMsg:string;
if(响应的错误实例){
console.log('Errorhandling if block');//这会在404上触发
const body=error.json();
const err=body.error | | JSON.stringify(body);
errMsg=`${error.status}-${error.statusText | |'''}${err}`;
}否则{
errMsg=error.message?error.message:error.toString();
}
console.error('error',errMsg);//但这不会出现在日志中
返回可观察抛出(errMsg);
}

我的目标是捕获一个404,而不是让它抛出我之前发布的JSON.parse错误,并通过发送一个空的JSON对象(或一个伪JSON对象)来处理它,这样日历中的一天就不会显示任何内容

你的问题就在眼前

const body = error.json() || '';
问题是,当后端发送错误(这里是404)时,您不会发送JSON对象。因此,如果使用
error.json()
,不要期望得到json对象

要么从后端返回JSON错误,要么在错误处理程序中不使用
JSON()
函数

当您不使用
json()
函数时,您还可以访问包含错误代码的
status
属性(如果我没记错的话,就是这个属性)。所以你可以给它加上条件,比如如果它是404,你可以做你想做的


我希望我已经说清楚了,如果没有,请随意询问更多细节

我直接从Angular.io中获取了handleError函数的这一部分,我认为这会很好。。。我会在这方面做一点试验。是的,我开始时也这么做了,但你必须考虑到响应高度依赖于你的后端,而且(至少对我来说)你很少考虑在发生错误时发送json对象。似乎测试错误。状态作为字符串工作,因此,我似乎能够在这里捕获它,并在我的组件中进一步处理它。在这一点上,我相信这将是我需要的解决方案,因此感谢我的endTry a
console.log(error)
,并查看您也可以使用哪些字段。别担心,这既不是一个修复方法,也不是一个解决方法,响应对象就是这样使用的,您会看到它们甚至有一个
\u body
,这实际上是
JSON()函数返回的(作为JSON)