CORS问题:使用本地IP在移动端测试MERN+Next.js应用无法连接Express服务
该CORS问题的常见原因及解决方案
前端请求的目标地址配置错误
本地开发时你大概率在Next.js里把后端请求地址写死成了http://localhost:<后端端口>,移动端通过本地IP访问前端时,axios发起请求的目标还是localhost,对应移动端自身的本地端口而非你电脑上运行的Express服务,自然会触发跨域拦截。需要把前端请求的后端地址改成你电脑的局域网IP,比如http://192.168.x.x:<后端端口>。CORS配置没有覆盖预检请求
你只配置了普通请求的Access-Control-Allow-Origin: *,但如果你的请求带自定义头部、使用了PUT/DELETE等非简单请求方法,浏览器会先发送OPTIONS预检请求,如果你没有给OPTIONS请求也返回对应的CORS头,依然会被拦截。Express可以直接用cors包一键处理所有情况,安装后直接引入启用即可,比手动配置响应头更不容易漏项:
const cors = require('cors'); app.use(cors());
- Express服务绑定的地址仅允许本机访问
如果你的Express启动时只监听了127.0.0.1或者localhost,只有本机的请求能访问,局域网内其他设备(包括你的测试手机)发的请求会直接被拒,表现出来也会是跨域报错。启动服务时要监听0.0.0.0,示例如下:
app.listen(3001, '0.0.0.0', () => { console.log('服务运行在 http://0.0.0.0:3001'); })
- 带凭证的请求不支持通配符Origin
如果你的请求带了Cookie或者其他身份凭证(axios配置了withCredentials: true),浏览器不允许Access-Control-Allow-Origin设为*,必须精确匹配请求的Origin值,同时还要配置Access-Control-Allow-Credentials: true。这种情况可以把Origin设置成你当前前端访问的本地IP地址,或者动态匹配允许的Origin列表。
内容的提问来源于stack exchange,提问作者nodeman
相关产品推荐
相关产品推荐

