Node.js Request库下载文件时如何处理URI错误?
解决request库无效URL导致脚本崩溃的问题
这个问题我之前也遇到过!核心原因是无效URL的错误是同步抛出的,根本没等到你绑定on('error')事件就已经崩溃了,所以之前的错误处理代码完全没机会生效。
问题根源
当你传入像"notagoodurl"这种完全不符合URI格式的字符串时,request.get()在初始化请求的同步阶段就会直接抛出Invalid URI错误,而不是通过异步的error事件触发。这时候你的on('error')回调还没被绑定,自然无法捕获这个错误。
修正方案
我们需要结合try-catch(捕获同步错误)和on('error')(捕获异步阶段的错误)来实现完整的错误处理,同时还要处理文件写入环节的错误。下面是完整的示例代码:
const request = require('request'); const fs = require('fs'); function downloadFile(url, destination) { try { // 用try-catch包裹request.get(),捕获同步阶段的无效URL错误 const req = request.get(url) // 处理请求过程中的异步错误(比如网络连接失败、DNS解析失败等) .on('error', function(err) { console.error(`下载请求出错: ${err.message}`); // 这里可以添加日志记录逻辑,比如写入日志文件 // logger.error(`下载错误详情: ${err.stack}`); }) // 管道传输到文件流,同时监听文件写入的错误 .pipe(fs.createWriteStream(destination) .on('close', function() { console.log(`文件已成功下载到: ${destination}`); }) .on('error', function(err) { console.error(`写入文件出错: ${err.message}`); // 记录文件写入错误日志 // logger.error(`文件写入错误详情: ${err.stack}`); }) ); } catch (err) { // 捕获同步阶段的错误(比如无效URI) console.error(`请求初始化失败: ${err.message}`); // 记录初始化错误日志 // logger.error(`请求初始化错误详情: ${err.stack}`); } } // 测试无效URL场景 downloadFile('notagoodurl', './invalid-test.txt'); // 测试有效URL场景 downloadFile('https://example.com/test-file.txt', './valid-test.txt');
各部分错误处理说明
try-catch块:专门捕获request.get()初始化时的同步错误,比如无效URI、参数类型错误等。request.get().on('error'):处理请求发起后的异步错误,比如网络超时、服务器拒绝连接等。fs.createWriteStream().on('error'):处理文件写入环节的错误,比如磁盘空间不足、权限不足、目标路径不存在等。
这样修改后,无论是无效URL还是其他环节的错误,都能被捕获并记录日志,脚本也不会直接崩溃了。
内容的提问来源于stack exchange,提问作者stackers
相关产品推荐
相关产品推荐

