在 Nest.js 中使用 Axios 检测流下载中的网络错误的正确方法是什么?



我正在使用Nest的HttpService模块.js来进行HTTP调用。我可以从https://unsplash.com下载图像;当没有网络中断时,代码按预期工作。

这是我进行下载调用并开始写入所需文件

的代码
const urlDownload = 'https://unsplash.com/photos/xiie4XeSzTU/download?force=true';
let response = await this.httpService.get(urlDownload, {
responseType: 'stream'
}).toPromise();
response.data.pipe(writer);

这是我尝试处理编写器的可能事件并返回响应的代码

let downloadFile = path.resolve(__dirname,'../../files/landscape.jpg');
let writer = fs.createWriteStream(downloadFile);
return new Promise((resolve, reject) => {
writer.on('finish', ()=>{
resolve('Image downloaded');
});
writer.on('error', ()=>{
reject('Image downloaded failed');
});
});

我故意在下载过程中关闭 wifi 以尝试服务器响应,图像下载失败(我在编写器错误处理程序中的内容(,但相反,我收到 500 statusCode,内部服务器错误。当我转到 Nest 控制台以显示错误时

[Nest] 11220   - 2020-05-22 18:16:45   [ExceptionsHandler] getaddrinfo ENOTFOUND unsplash.com +439536ms
Error: getaddrinfo ENOTFOUND unsplash.com
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:64:26)

如何解决此问题并纠正来自 Nest 的网络错误以返回友好消息?

我可以解决它。我把它放在这里,希望将来能帮助别人。

它不会触发错误处理程序函数,因为该处理程序已附加到写入程序,并且没有写入错误,它只是因为连接中断而停止写入,但这不是错误。

我重写了响应变量以停止承诺,更好的是我开始将其视为观察者。

let response = this.httpService.get(urlDownload, {
responseType: 'stream',
});

然后是上一个Promise格式的响应

return new Promise((resolve, reject) => {
writer.on('error', () => {
resolve('error due to, possibly, an unexisting file path');
})
response.subscribe({
next(response) { response.data.pipe(writer) },
error(err) {
console.error('More details: ' + err);
resolve('Error in the download :/')
},
complete() { resolve('Completed'); }
})
});

我没有使用承诺的拒绝功能,但它是完全可行的