同局域网Android设备无法调用本地Serverless Offline NodeJS接口
问题背景
本地搭建基于Serverless框架的NodeJS服务,本机浏览器、Postman调用接口可正常响应,同一局域网内的Android设备发起调用时访问失败。
相关配置、代码及报错信息如下:
serverless.yml配置
service: aws-debug-locally frameworkVersion: '3' provider: name: aws runtime: nodejs12.x plugins: - serverless-offline custom: serverless-offline: httpsProtocol: "cert" noPrependStageInUrl: true functions: hello: handler: index.handler events: - http: path: /hello method: any
服务启动后默认接口地址为https://localhost:3000/hello,本机调用正常返回结果。
Android端调用代码
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded/json/gzip'; axios.defaults.headers.post.Authorization = token; const url = 'https://localhost:3000/hello'; return axios.post(url, compressedData, { onUploadProgress: progressEvent => { console.log('uploading') }, onDownloadProgress: progressEvent => { console.log('downloading') }, }).then((response) => { });
报错信息
Android Studio抛出错误日志:
E/Capacitor/Console: File: http://localhost/vendor.js - Line 2519 - Msg: ERROR Error: Uncaught (in promise): Error: Network Error Error: Network Error polyfills.js:3467 POST https://localhost:3000/hello net::ERR_CONNECTION_REFUSED
Chrome调试检查器可查看到对应网络错误报错。
解决方案
报错核心是ERR_CONNECTION_REFUSED即连接被拒绝,按以下步骤逐一排查修复:
- 修正地址错误:
localhost是设备本地回环地址,Android端代码里写的localhost指向Android设备自身,不是运行服务的电脑。- 查询运行服务的电脑在当前局域网的IPv4地址:Windows系统执行
ipconfig,macOS/Linux系统执行ip a,找到和Android设备同网段的地址,一般为192.168.x.x格式。 - 修改serverless-offline配置,让服务监听所有网卡,默认配置下服务仅监听127.0.0.1回环地址,局域网设备无法访问。在
custom.serverless-offline下新增host: '0.0.0.0'配置:custom: serverless-offline: httpsProtocol: "cert" noPrependStageInUrl: true host: '0.0.0.0' - 重启Serverless服务,将Android端请求地址中的
localhost替换为上一步查到的电脑局域网IP,例如https://192.168.3.12:3000/hello。
*如果使用Android模拟器而非真机,模拟器访问宿主机的默认地址为10.0.2.2,无需查询局域网IP,直接将地址替换为对应格式即可,同时仍需配置服务监听0.0.0.0。
- 查询运行服务的电脑在当前局域网的IPv4地址:Windows系统执行
- 排查HTTPS证书问题:当前配置开启了自签名HTTPS证书,Android系统默认不信任用户自签名证书,会直接拦截请求。本地调试阶段可直接删除
httpsProtocol: "cert"配置,改用HTTP协议发起请求,地址对应改为http://[电脑局域网IP]:3000/hello即可绕过证书校验;如果必须使用HTTPS,可将自签名证书导入Android设备的系统信任证书列表,或在调试阶段临时关闭Axios的SSL校验(正式发布版本禁止使用该配置)。 - 排查防火墙拦截:检查电脑的系统防火墙(Windows Defender、macOS防火墙等)规则,确认3000端口的入站连接已放开,可临时关闭防火墙测试连通性,测试通过后再添加对应端口的放行规则。
内容的提问来源于stack exchange,提问作者user19517065
相关产品推荐
相关产品推荐

