Node.js Fetch请求中如何判断网络错误类型(如ENOTFOUND)
在Node.js中通过fetch捕获网络错误时正确判断错误类型
当你在Node.js中使用fetch发起请求遇到网络错误时,抛出的TypeError本身不会直接携带code属性,真正的错误码(比如ENOTFOUND)会嵌套在错误的cause属性里。要正确判断这类错误,可以按照以下方式处理:
步骤1:捕获并逐层解析错误
在try/catch块中捕获错误后,先检查错误的cause属性——网络相关的系统错误会被包装在这里面。
步骤2:判断错误类型和错误码
通过instanceof确保类型安全,再访问cause.code获取具体错误码,根据不同码值做针对性处理。
完整代码示例
async function fetchData(url) { try { const response = await fetch(url); if (!response.ok) { // 处理HTTP状态码错误(如4xx、5xx) throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (err) { // 处理网络类系统错误 if (err instanceof TypeError && err.cause instanceof Error) { const systemError = err.cause; switch (systemError.code) { case 'ENOTFOUND': console.log('错误:目标域名无法解析'); break; case 'ECONNREFUSED': console.log('错误:连接被拒绝'); break; // 可扩展更多需要处理的错误码 default: console.log(`未知网络错误:${systemError.code}`); } } else { // 处理其他类型错误(如HTTP状态错误、业务逻辑错误) console.log(err.message); } } } // 测试调用 fetchData('https://nonexistent.example.com');
补充说明
- Node.js的fetch API会将底层系统错误(DNS解析失败、连接拒绝等)包装成
TypeError,原始错误存入cause属性 - 注意区分网络错误(请求未发送/连接失败)和HTTP状态错误(请求发送成功但返回非2xx状态码)
- 若需统一处理所有错误,可优先检查
err.cause是否存在,再处理系统级错误
内容的提问来源于stack exchange,提问作者jewoper
相关产品推荐
相关产品推荐

