我正在使用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'); }
})
});
我没有使用承诺的拒绝功能,但它是完全可行的