Node.js 如何正确处理使用Nestjs HTTP模块向Axios发出HTTP请求时返回的可观察数据

Node.js 如何正确处理使用Nestjs HTTP模块向Axios发出HTTP请求时返回的可观察数据,node.js,rxjs,axios,nestjs,Node.js,Rxjs,Axios,Nestjs,我试图弄清楚如何使用Axios和Nestjs框架发出http请求。在nest文档中,它提供了流程的高级概述,但没有详细说明如何处理使用axios发出请求时返回的可观察数据 我正在使用相互SSL身份验证向API发出请求。我有一个证书问题,我的请求失败,但是没有引发异常,控制器返回了一个没有数据的200 ok。当我注释掉所有rxjs代码并执行axios.get(…).toPromise()时,我发现了这一点。当我这样做的时候,我突然有了一个完整的堆栈跟踪,并且抛出了一个异常 知道我做错了什么吗?我应

我试图弄清楚如何使用Axios和Nestjs框架发出http请求。在nest文档中,它提供了流程的高级概述,但没有详细说明如何处理使用axios发出请求时返回的可观察数据

我正在使用相互SSL身份验证向API发出请求。我有一个证书问题,我的请求失败,但是没有引发异常,控制器返回了一个没有数据的200 ok。当我注释掉所有rxjs代码并执行axios.get(…).toPromise()时,我发现了这一点。当我这样做的时候,我突然有了一个完整的堆栈跟踪,并且抛出了一个异常

知道我做错了什么吗?我应该把catchError块放在map块之前吗

我的代码:

getRegistrationStatus(msisdn: string): Observable<AxiosResponse> {        
        return this.httpService.get(`${this.API_BASE_URL}/vb/registrationStatus?MSISDN=${msisdn}`)
        .pipe(            
            map(res => res.data),
            catchError(e => {
                throw new HttpException(e.statusText, e.status);
            })            
        );
    }
getRegistrationStatus(msisdn:string):可观察{
返回此.httpService.get(`${this.API_BASE_URL}/vb/registrationStatus?MSISDN=${MSISDN}`)
.管道(
映射(res=>res.data),
捕捉错误(e=>{
抛出新的HttpException(e.statusText,e.status);
})            
);
}
我的HTTP模块/axios配置:

HttpModule.register({ 超时:20000, validateStatus:()=>正确, httpsAgent:新代理({ ca:readFileSync(process.env.va_ca), keepAlive:false,
证书:readFileSync(process.env.va_证书), key:readFileSync(process.env.va_key), 密码短语:process.env.va_密码短语 })
})

axiosInstance应该返回一个承诺,而不是可观察的。

axiosInstance应该返回一个承诺,而不是可观察的。

我建议返回一个仅发出请求的实际数据而不是
AxiosResponse的可观察的。通常建议在创建http请求的函数(
getRegistrationStatus
)中直接处理http错误,而不是在调用/使用此函数的位置

//如果您没有
//相应的接口,但如果可以,最好创建一个
getRegistrationStatus(msisdn:string):可观察{
返回此.httpService.get(`${this.API_BASE_URL}/vb/registrationStatus?MSISDN=${MSISDN}`)
.管道(
映射(res=>res.data),
catchError(this.handleError(null))//{
if(error.response){
//请求已发出,服务器用状态代码响应
//这超出了2xx的范围
console.log(error.response.data);
日志(错误、响应、状态);
日志(error.response.headers);
}else if(error.request){
//提出了请求,但没有收到任何答复
//'error.request'是浏览器中XMLHttpRequest的实例,也是
//node.js中的http.ClientRequest
console.log(error.request);
}否则{
//设置触发错误的请求时发生了一些问题
console.log('Error',Error.message);
}
log(error.config);
返回(结果为T);
}
}
调用函数并订阅

getRegistrationStatus(msisdn:string)。订阅(regStatus=>{
//发生错误时,regStatus将为null
console.log('注册状态:',regStatus);
})

我建议返回一个仅发出请求实际数据而不是
AxiosResponse
的Observable。通常建议直接在创建http请求的函数(
getRegistrationStatus
)中处理http错误,而不是在调用/使用此函数的地方

//如果您没有
//相应的接口,但如果可以,最好创建一个
getRegistrationStatus(msisdn:string):可观察{
返回此.httpService.get(`${this.API_BASE_URL}/vb/registrationStatus?MSISDN=${MSISDN}`)
.管道(
映射(res=>res.data),
catchError(this.handleError(null))//{
if(error.response){
//请求已发出,服务器用状态代码响应
//这超出了2xx的范围
console.log(error.response.data);
日志(错误、响应、状态);
日志(error.response.headers);
}else if(error.request){
//提出了请求,但没有收到任何答复
//'error.request'是浏览器中XMLHttpRequest的实例,也是
//node.js中的http.ClientRequest
console.log(error.request);
}否则{
//设置触发错误的请求时发生了一些问题
console.log('Error',Error.message);
}
log(error.config);
返回(结果为T);
}
}
调用函数并订阅

getRegistrationStatus(msisdn:string)。订阅(regStatus=>{
//发生错误时,regStatus将为null
console.log('注册状态:',regStatus);
})

nestjs HTTP模块将axios响应转换为可观察的…抱歉,我不知道您使用的是nestjs提供的服务,该服务将axios包装为可观察的。nestjs HTTP模块将axios响应转换为可观察的…抱歉,我不知道您使用的是nestjs提供的服务,该服务将axios包装为可观察的令人难以置信。