新手开发者求助:Fetch触发Possible Unhandled Promise Rejection与网络请求失败
排查"Possible Unhandled Promise Rejection"和"Network request failed"问题
核心问题分析
你的代码没处理fetch抛出的网络异常,同时存在几处逻辑疏漏,一步步来修正和排查:
1. 先给fetch加上异常捕获逻辑
fetch只有在网络层面失败时(比如DNS解析失败、服务器无响应、网络断开)才会抛出Promise拒绝,你的代码没做捕获,直接导致"Unhandled Promise Rejection"报错。必须用try/catch包裹请求逻辑:
import { User } from '../context/auth'; import { API_URL } from '../config'; import { Alert } from 'react-native'; export const login = async (username: string): Promise<User> => { try { const response = await fetch(`${API_URL}/login`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ username }) }); // 用response.ok判断更严谨,覆盖所有2xx成功状态码 if (!response.ok) { const errorDetail = await response.text(); console.error('登录接口返回错误:', errorDetail); Alert.alert('登录失败', '用户名错误或服务器异常'); throw new Error('登录接口返回非成功状态'); } // 解析响应并返回符合User类型的数据,满足函数返回值声明 const userData = await response.json(); console.log('登录成功:', userData); return userData as User; } catch (error) { console.error('网络请求失败详情:', error); Alert.alert('网络错误', '无法连接到服务器,请检查网络或服务器状态'); // 抛出错误让调用方处理,或根据需求返回错误值 throw error; } }
2. 定位具体网络失败原因
捕获错误后,通过console.error打印的详细信息,结合以下点排查:
- 检查
API_URL是否正确:本地调试时,React Native模拟器/真机不能用localhost,要换成电脑的局域网IP(比如192.168.x.x),因为设备和电脑不在同一localhost环境。 - 确认后端服务器是否在运行,
/login接口是否存在且配置正确。 - 检查设备网络状态,能否正常访问服务器地址。
- Android需确认
AndroidManifest.xml里是否添加了<uses-permission android:name="android.permission.INTERNET" />权限;iOS模拟器需确保网络权限正常。
3. 修正其他逻辑问题
- 原函数声明返回
Promise<User>,但没有任何return语句,必须解析响应JSON并返回符合User类型的数据。 - 原代码用
response.status !== 200判断成功,换成response.ok更严谨,覆盖所有2xx状态码。 - 原Alert的注释标注"Network request failed",但该分支是HTTP状态码非200的情况,并非网络层面失败,要区分两种错误场景。
内容的提问来源于stack exchange,提问作者Guilherme Hoffmann
相关产品推荐
相关产品推荐

