Flutter调用Node.js API时出现Connection refused错误求助
E/flutter (15338): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Connection refused
E/flutter (15338): #0 IOClient.send (package:http/src/io_client.dart:88:7)
E/flutter (15338):
E/flutter (15338): #1 BaseClient._sendUnstreamed (package:http/src/base_client.dart:93:32)
E/flutter (15338):
E/flutter (15338): #2_withClient (package:http/http.dart:164:12)
E/flutter (15338): < asynchronous suspension>
确认Node.js服务状态:
先在本地终端执行curl http://localhost:你的API端口测试,验证服务是否正常响应。如果本地都无法访问,优先排查Node.js启动问题,比如端口被占用、代码语法错误、依赖缺失等。修正模拟器/真机的请求地址:
- Android模拟器不能直接用
localhost,需替换为10.0.2.2(模拟器映射电脑本地的专属地址) - iOS模拟器可直接使用
localhost或127.0.0.1 - 真机测试时,必须使用电脑的局域网IP(如
192.168.1.105),且手机与电脑处于同一WiFi网络下
- Android模拟器不能直接用
检查Node.js的监听配置:
确保Node.js服务监听0.0.0.0而非127.0.0.1,否则外部设备无法访问。示例代码:const express = require('express'); const app = express(); app.listen(3000, '0.0.0.0', () => { console.log('Server running on http://0.0.0.0:3000'); });排查防火墙拦截:
检查电脑防火墙设置,确保Node.js使用的端口(如3000)允许入站连接。若使用第三方安全软件,需确认未拦截该端口的网络请求。配置Flutter端网络权限:
- Android:在
android/app/src/main/AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET"/> - iOS:若使用HTTP请求,需在
ios/Runner/Info.plist中添加ATS例外:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
- Android:在
内容的提问来源于stack exchange,提问作者Drip

