Typescript 如何将responseError正确地用于自定义Aurelia http获取客户端拦截器?

Typescript 如何将responseError正确地用于自定义Aurelia http获取客户端拦截器?,typescript,aurelia,aurelia-fetch-client,Typescript,Aurelia,Aurelia Fetch Client,我正在处理一个Aurelia CLI项目,使用TypeScript和Aurelia fetch client对.NET Core/Web API后端进行HTTP调用 服务器通过返回一个APIRROR JSON结果作为API响应主体,状态代码在5xx范围内,对未处理的异常进行标准化 在客户端,我想使用一个拦截器来执行这些错误的客户端发布,但是添加拦截器会以一种不希望的方式改变控制流 这是main.ts中的相关配置: function configureContainer(container: Co

我正在处理一个Aurelia CLI项目,使用TypeScript和
Aurelia fetch client
对.NET Core/Web API后端进行HTTP调用

服务器通过返回一个APIRROR JSON结果作为API响应主体,状态代码在5xx范围内,对未处理的异常进行标准化

在客户端,我想使用一个拦截器来执行这些错误的客户端发布,但是添加拦截器会以一种不希望的方式改变控制流

这是
main.ts
中的相关配置:

function configureContainer(container: Container) {
    const http = new HttpClient();
    http.configure((config: HttpClientConfiguration) => {
        config.useStandardConfiguration()
            .withBaseUrl("/api/")
            .withInterceptor(new ApiErrorInterceptor(container.get(EventAggregator)));
    });

    container.registerInstance(HttpClient, http);
}
这就是拦截器:

import { autoinject } from "aurelia-framework";
import { EventAggregator } from "aurelia-event-aggregator";
import { Interceptor } from "aurelia-fetch-client";

@autoinject
export class ApiErrorInterceptor implements Interceptor {
    constructor(private readonly _aggregator: EventAggregator) {
    }

    responseError(error: any) {
        // do something with the error            

        return error;
    }
}
responseError(response: any): Promise<Response> {
    if (response instanceof Response) {
        return response.json().then((serverError: ServerError) => {

            // Do something with the error here.

            return Promise.reject<Response>(serverError.error);
        }); 
    }
}
如果未添加自定义拦截器,则会在Chrome中将非OK响应记录为错误,如下所示:

Unhandled rejection (<{}>, no stack trace)

使用
返回承诺。拒绝(错误)代替
返回错误
正在使用您的代码按预期编译和工作。返回错误假定您已解析响应,并将返回值传递到解析的代码路径,这就是您看到不希望出现的行为的原因。

responseError的错误参数是any,因此请确保它是您认为的。在我的例子中,我期待着失败的响应,但得到了捕获到的
TypeError
异常。这是我的拦截器:

import { autoinject } from "aurelia-framework";
import { EventAggregator } from "aurelia-event-aggregator";
import { Interceptor } from "aurelia-fetch-client";

@autoinject
export class ApiErrorInterceptor implements Interceptor {
    constructor(private readonly _aggregator: EventAggregator) {
    }

    responseError(error: any) {
        // do something with the error            

        return error;
    }
}
responseError(response: any): Promise<Response> {
    if (response instanceof Response) {
        return response.json().then((serverError: ServerError) => {

            // Do something with the error here.

            return Promise.reject<Response>(serverError.error);
        }); 
    }
}
responseError(响应:任意):承诺{
if(响应实例of response){
返回response.json()。然后((serverError:serverError)=>{
//在这里处理错误。
返回承诺.拒绝(serverError.error);
}); 
}
}

在.NET核心应用程序中配置异常处理中间件的方式也导致了一些问题。在我的例子中,
usedeveloperceptionpage
在获取客户机中导致CORS错误。听起来这和你的问题不一样,但你可以将你的配置与我的配置进行比较

嗨,你看了获取源代码了吗?在我看来,fetch和http客户机一样从不拒绝这个承诺。它将始终调用响应,您必须检查状态代码。我认为您所做的(返回错误)是正确的,您只需处理响应中的错误。