Expo开发React Native:iOS端HTTP请求丢失Authorization头求解决方案
解决方案
1. 检查请求头的拼写与格式
确保请求头键名是**Authorization**(注意大小写,iOS对HTTP头的大小写敏感程度和Android存在差异),且Bearer Token格式正确:
// fetch示例 fetch('http://你的本地NestJS地址/api/xxx', { method: 'GET', headers: { 'Authorization': 'Bearer ' + yourToken, // 注意Bearer后有空格 'Content-Type': 'application/json' } }) // axios示例 axios.get('http://你的本地NestJS地址/api/xxx', { headers: { 'Authorization': 'Bearer ' + yourToken } })
2. 调整NestJS后端CORS配置
在main.ts中明确允许Authorization头,iOS对CORS响应头的检查比Android更严格:
async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors({ origin: true, // 开发环境临时允许所有来源,生产环境需指定具体域名 allowedHeaders: ['Content-Type', 'Authorization'], // 必须明确列出自定义头 credentials: true }); await app.listen(3000); } bootstrap();
3. 配置Expo的iOS ATS规则
因为后端是本地HTTP服务,iOS默认会限制非HTTPS请求,需在app.json中添加ATS例外:
{ "expo": { "ios": { "infoPlist": { "NSAppTransportSecurity": { "NSExceptionDomains": { "localhost": { "NSIncludesSubdomains": true, "NSAllowsLocalNetworking": true } } } } } } }
配置完成后重启Expo Go,重新加载项目。
4. 清除Expo Go缓存
iOS的Expo Go可能缓存旧配置导致请求头不生效:
- 完全关闭Expo Go应用
- 进入手机「设置」→「Expo Go」→「清除缓存」
- 重新打开Expo Go并加载项目
5. 验证请求头是否真的丢失
在NestJS后端添加日志中间件,打印所有请求头,确认iOS端请求是否确实未携带Authorization:
// 在main.ts中添加中间件 app.use((req, res, next) => { console.log('请求头:', req.headers); next(); });
如果后端能收到头,则排查后续鉴权逻辑的平台差异;若未收到,再重复检查前面的配置步骤。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

