为了账号安全,请及时绑定邮箱和手机立即绑定

Angular:无法通过 HttpResponse 返回自定义错误消息

Angular:无法通过 HttpResponse 返回自定义错误消息

C#
喵喵时光机 2021-10-31 20:05:40
我一直在谷歌搜索解决方法并看到我们在控制器操作中作为ActionResult/JsonResult或使用HttpRequest如下方法返回错误文本时的示例HttpContext.Current.Response.Status = "error text";对于我的后台应用程序,我使用ASP.NET Core 2.1.1和.Status属性在缺少HttpResponse类。此外,我找不到任何可能包含我的自定义错误消息的属性。我使用中间件类,它获取异常描述并将其作为 JSONStartup.csapp.UseMiddleware<ExceptionHandleMiddleware>();班级本身public class ExceptionHandleMiddleware{    private readonly RequestDelegate next;    public ExceptionHandleMiddleware(RequestDelegate next)    {        this.next = next ?? throw new ArgumentNullException(nameof(next));    }    public async Task Invoke(HttpContext context)    {        try        {            await next(context);        }        catch (Exception ex)        {            context.Response.Clear();            context.Response.Headers.Add("Access-Control-Allow-Origin", "*");            context.Response.ContentType = "application/json";            context.Response.StatusCode = StatusCodes.Status500InternalServerError;            await context.Response.WriteAsync(JsonConvert.SerializeObject(new { error = $"{ex.GetType().FullName}: '{ex.Message}'" }));        }    }}看看行context.Response.StatusCode = StatusCodes.Status500InternalServerError;这是必需的,因为在我的Angular 6 应用程序中,我使用HttpInterceptor,并且为了捕获错误,您应该返回一个 HTTP 错误(否则.catch(...)在 Angular 拦截器中不会触发该块)。这是我的 Angular 应用程序中的一点@Injectable()export class ErrorHandlerInterceptor implements HttpInterceptor {    constructor(        private notify: NgNotify,    ) { }    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {        return next            .handle(req)            .catch(this.handleError)    }    ...尽管context.Response.WriteAsync(...)bit确实返回了异常文本,但我无法.catch(...)在拦截器的块中提取它。所以,我似乎无法从error: Response.也许,有人知道将错误传递给 Angular 客户端并在那里获取它的更好方法?
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

我的疏忽。


如果您查看返回的 JSON


  ....


  "message":"Http failure response for https://localhost:44305/api/Entry/GetNext?id=11962: 500 OK",

  "error":{  


  }

}

error似乎是一个空对象


代替事实上error是Blob,我们应该以下面的方式阅读


intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next

        .handle(req)

        .catch(this.handleError)

}


public handleError = (error: Response) => {


    let reader = new FileReader();


    let ngNotify = this._ngNotify;


    reader.onload = function () {


        var result = JSON.parse(this.result);


        ngNotify.nofity('Error', result.error);

    };


    reader.readAsText(error['error']);


    return Observable.throw(error)

}

就是这样。


查看完整回答
反对 回复 2021-10-31
?
茅侃侃

TA贡献1842条经验 获得超21个赞

我最终通过实现中间件来拦截HttpResponse、从 blob 中提取错误并在 json 中返回消息来解决这个问题。感谢JaapMosselman 的贡献


查看完整回答
反对 回复 2021-10-31
  • 2 回答
  • 0 关注
  • 532 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信