Ngrok 配置:实现 Uniapp 前后端项目内网穿透

文章目录

    • 一、下载并安装 ngrok
    • 二、配置 ngrok Authtoken
    • 三、启动本地 uniapp 项目
    • 四、使用 ngrok 暴露本地服务
    • 五、通过公网 URL 访问项目
    • 六、后端API项目的穿透问题排查 (uni-app + 后端 API 示例)
      • 交互流程图示
    • 七、ngrok Web 界面 (本地监控)
    • 八、停止 ngrok
    • 总结

ngrok 是一款强大的工具,可以让你将本地运行的 web 服务暴露到公网上,非常适合用于本地开发调试、向客户演示项目或测试 webhook 等场景。

一、下载并安装 ngrok

  1. 访问 ngrok 官网下载页面:https://ngrok.com/download

  2. 下载 Windows 版本的 ngrok

  3. 解压 ngrok:将下载的 ngrok.zip 文件解压到一个你方便访问的目录,解压后你会得到一个 ngrok.exe 文件。
    在这里插入图片描述

二、配置 ngrok Authtoken

为了使用 ngrok 的更多功能(例如自定义子域名等,尽管某些高级功能可能需要付费),建议连接到你的 ngrok 账户。

  1. 登录 ngrok 官网:访问 https://dashboard.ngrok.com/。

  2. 获取 Authtoken:在仪表盘的 “Your Authtoken” 或 “Setup & Installation” 部分,你会找到你的 Authtoken。

  3. 配置 Authtoken

    • 运行ngrok.exe
    • 运行以下命令(将 YOUR_AUTHTOKEN 替换为你自己的 Authtoken):
      .\ngrok.exe config add-authtoken YOUR_AUTHTOKEN
      
    • 成功后,ngrok 会将 Authtoken 保存到其默认的配置文件中 (通常在 C:\Users\YourUserName\.ngrok2\ngrok.yml)。

    可选:将 ngrok添加到系统环境变量 (PATH)
    为了在任何目录下都能直接运行 ngrok 命令,而不是每次都 cd 到其所在目录,你可以将其路径添加到系统环境变量 PATH 中。

    1. 在 Windows 搜索中搜索"环境变量",选择"编辑系统环境变量"。
    2. 在"系统属性"窗口中,点击"系统变量(N)…"按钮。
    3. 在"系统变量"区域找到名为 Path 的变量,选中它,然后点击"编辑(E)…"。
    4. 点击"新建(N)",然后输入 ngrok.exe 所在的目录路径 (例如 D:\tools\ngrok)。
    5. 一路点击"确定"保存更改。之后新打开的命令行窗口即可直接使用 ngrok 命令。
    • (截图机会:展示添加环境变量的步骤)

三、启动本地 uniapp 项目

接下来,我们需要一个在本地运行的 web 服务。这里以 uniapp H5 项目为例。

  1. 进入 uniapp 项目目录:使用命令行工具 (CMD, PowerShell, Git Bash 等) cd 到你的 uniapp 项目根目录。
  2. 启动开发服务器:运行 uniapp 的 H5 开发命令。
    • 如果使用 npm:
      npm run dev:h5
      
    • 如果使用 yarn:
      yarn dev:h5
      
  3. 记录本地地址和端口:项目启动后,命令行通常会显示 H5 预览地址,例如 http://localhost:8080http://127.0.0.1:3000。记下这个端口号,我们稍后会用到。

四、使用 ngrok 暴露本地服务

现在,我们将使用 ngrok 将本地运行的 uniapp 项目暴露到公网上。

  1. 新建域并启动

  2. 启动隧道,运行 ngrok 命令
    在这里插入图片描述

  3. 获取公网URL:ngrok 启动后,会在命令行界面显示一些信息,最重要的就是 Forwarding 中的https:// 开头的 URL,这就是你的公网访问地址。

五、通过公网 URL 访问项目

现在,你或你的朋友、同事、客户等,可以在任何有网络连接的设备上,通过浏览器打开上一步中 ngrok 生成的 Forwarding URL (通常建议使用 https 的那个),就能访问到你本地运行的 uniapp 项目了,到这里对于未配置后端的项目来说已经穿透成功了。

六、后端API项目的穿透问题排查 (uni-app + 后端 API 示例)

当你使用 uni-app 开发前端,并需要连接到一个独立的后端 API 服务(例如 Java Spring Boot, Node.js 等)时,通过 ngrok 暴露前端后,可能会遇到 API 请求失败的问题。本地直接访问 localhost:UNIAPP_DEV_PORT (uni-app H5 运行的端口) 时一切正常,但通过 ngrok 生成的公网 URL 访问时,后端接口调用不通。

常见现象:

  • 浏览器开发者工具的网络(Network)标签页显示 API 请求失败,错误可能是 net::ERR_CONNECTION_REFUSED
  • 或者,如果后端没有正确配置CORS,可能会看到跨域相关的错误信息。

主要原因及解决方案 (针对绝对 BASE_URL 配置):

假设你的 uni-app 项目中,API 请求的基础路径 BASE_URL 是一个写死的本地地址,例如:

// 在 api/index.js 或类似文件中
const BASE_URL = 'http://localhost:8080/api'; // 你的后端API基础路径
  1. 问题核心:localhost 指向的是客户端

    • 当你的同学或同事通过 ngrok 的公网 URL (例如 https://xxxx.ngrok.io) 访问你的 uni-app 应用时,应用内的 JavaScript 代码(包括 API 请求)是在他们的浏览器中执行的。
    • 因此,代码中对 http://localhost:8080/api 的请求,实际上是尝试连接他们自己电脑上的 localhost:8080 服务。如果他们的电脑上没有运行对应的后端服务,这个请求自然会失败。
  2. 解决方案:为后端 API 服务也启动 ngrok

    • 步骤1: 确保后端服务正常运行:首先,确保你的 Spring Boot (或其他) 后端服务正在你的开发机器上的 localhost:8080 (或你配置的任何端口) 成功运行。
    • 步骤2: 为后端启动单独的 ngrok 实例:打开一个新的命令行窗口,cd 到 ngrok.exe 所在的目录(或者如果已配置环境变量,直接运行),然后为你的后端服务端口启动 ngrok。如果后端运行在 8080 端口:
      ngrok http 8080
      
    • ngrok 会为你的后端服务生成另一个公网 URL,例如 https://yyyy.ngrok.io
    • 步骤3: (临时) 修改前端的 BASE_URL:回到你的 uni-app 项目代码,在 api/index.js (或类似文件) 中,将 BASE_URL 临时修改为 ngrok 为后端生成的公网地址:
      // 临时修改,用于公网演示
      const BASE_URL = 'https://yyyy.ngrok.io/api'; // 注意:这里是后端 ngrok 的地址
      
    • 步骤4: 重新编译 uni-app 项目 (如果需要),并确保访问前端 ngrok 地址的用户获取到的是更新了 BASE_URL 的前端代码。
    • 现在,通过前端 ngrok URL 访问应用时,API 请求就会正确地指向你通过 ngrok 暴露的公网后端服务了。
  3. 后端 CORS 配置:

    • 非常重要!你的后端服务(如 Spring Boot)必须配置 CORS (跨源资源共享) 策略,以允许来自你的前端 ngrok URL (例如 https://xxxx.ngrok.io) 和后端 ngrok URL (https://yyyy.ngrok.io,如果请求来源是它) 的请求。否则,即使地址正确,浏览器也可能因为安全策略阻止请求。
    • 在 Spring Boot 中,通常使用 @CrossOrigin注解或全局 CORS 配置。

替代方案 (推荐用于开发和更便捷的共享): 使用代理

虽然上述方法可行,但每次共享都需要修改 BASE_URL 并可能需要重新部署前端,比较繁琐。更推荐的做法是在 uni-app 开发服务器层面设置代理,将特定的 API 请求转发到本地后端。

  1. 前端 BASE_URL 使用相对路径:
    // api/index.js
    const BASE_URL = '/api_proxy'; // 一个自定义的代理前缀
    // ... 确保请求方法中 url 拼接正确,例如: request({ url: options.url ...}) 变成 request({ url: BASE_URL + options.url ...})
    // 如果 options.url 已经是 /resource/action, 那么拼接后就是 /api_proxy/resource/action
    
  2. 配置 vue.config.js (uni-app H5 项目根目录):
    如果项目根目录下没有 vue.config.js 文件,新建一个。
    // vue.config.js
    module.exports = {devServer: {proxy: {'/api_proxy': { // 匹配前端以 /api_proxy 开头的请求target: 'http://localhost:8080', // 你的本地后端服务地址changeOrigin: true, // 必须,用于支持跨域pathRewrite: {'^/api_proxy': '/api' // 将请求路径中的 /api_proxy 替换为 /api (如果后端是以 /api 开头的)// 例如 /api_proxy/users/list -> http://localhost:8080/api/users/list}}}}
    };
    
    修改 vue.config.js 后,需要重启 uni-app 开发服务器 (npm run dev:h5)。
  3. ngrok 暴露 uni-app 开发服务器: 这种情况下,你只需要像之前一样,用 ngrok 暴露 uni-app H5 运行的端口 (例如 ngrok http UNIAPP_DEV_PORT)。uni-app 的开发服务器会自动将 /api_proxy 的请求转发到你的本地后端。这样,前端代码中的 BASE_URL 无需改动,分享也更方便。

交互流程图示

下面通过图示来进一步说明两种主要配置下的工作流程。

(一) 绝对 BASE_URL + 前后端分别使用 Ngrok (推荐用于需要固定公网后端地址的场景)

这种配置下,前端代码中的 BASE_URL 直接指向后端 ngrok 的公网地址。

用户 (浏览器) Ngrok 云服务 前端 Ngrok 代理 (开发者电脑) 后端 Ngrok 代理 (开发者电脑) Uni-app 开发服务器 (localhost:portA) Spring Boot 后端 (localhost:portB) 1. 请求前端页面 (https://frontend.ngrok.io) 2. 转发请求 3. 请求本地前端服务 4. 返回前端页面代码 5. 返回前端页面代码 6. 返回前端页面代码 前端加载完成,发起API请求 (BASE_URL='https://backend.ngrok.io/api') 7. API 请求 (https://backend.ngrok.io/api/...) 8. 转发API请求 9. 请求本地后端服务 10. API 响应 11. API 响应 12. API 响应 用户 (浏览器) Ngrok 云服务 前端 Ngrok 代理 (开发者电脑) 后端 Ngrok 代理 (开发者电脑) Uni-app 开发服务器 (localhost:portA) Spring Boot 后端 (localhost:portB)

解释:

  • 用户 (自己或他人):通过 https://frontend.ngrok.io (前端的公网 ngrok 地址) 访问应用。
  • 前端应用加载后,其 API 请求直接指向 https://backend.ngrok.io/api (后端的公网 ngrok 地址)。
  • 这种方式清晰地分离了前端和后端的公网访问点。

(二) 相对 BASE_URL + Uni-app devServer.proxy + 前端使用 Ngrok (推荐用于开发调试和便捷分享)

这种配置下,前端代码中的 BASE_URL 是一个相对路径 (如 /api_proxy),由 Uni-app 开发服务器代理到本地后端。

用户 (浏览器) Ngrok 云服务 前端 Ngrok 代理 (开发者电脑) Uni-app 开发服务器 (含代理配置, localhost:portA) Spring Boot 后端 (localhost:portB) 1. 请求前端页面 (https://frontend.ngrok.io) 2. 转发请求 3. 请求本地前端服务 4. 返回前端页面代码 5. 返回前端页面代码 6. 返回前端页面代码 前端加载完成,发起API请求 (BASE_URL='/api_proxy') 7. API 请求 (https://frontend.ngrok.io/api_proxy/...) 8. 转发API请求至前端Ngrok代理 9. 请求本地前端服务 (路径 /api_proxy/...) Uni-app devServer 根据 proxy 配置: '/api_proxy/...' 转发到 'http://localhost:portB/api/...' 10. 代理转发API请求至本地后端 (http://localhost:portB/api/...) 11. API 响应 12. API 响应 13. API 响应 14. API 响应 用户 (浏览器) Ngrok 云服务 前端 Ngrok 代理 (开发者电脑) Uni-app 开发服务器 (含代理配置, localhost:portA) Spring Boot 后端 (localhost:portB)

解释:

  • 用户 (自己或他人):通过 https://frontend.ngrok.io 访问应用。
  • 前端应用加载后,其 API 请求 (例如 /api_proxy/users) 被发送到 https://frontend.ngrok.io/api_proxy/users
  • 这个请求到达开发者的 Uni-app 开发服务器后,其内部的代理设置会将此请求转发给实际运行在 localhost:portB 的后端服务。
  • 这种方式下,只需要为前端启动一个 ngrok 实例,配置相对简单。

通用排查提示:

  • 确认后端服务已启动并监听正确端口:这是最基本的一步。
  • 直接测试后端接口:使用 Postman、curl 或直接在浏览器中(如果接口支持GET)访问你的本地后端接口 (例如 http://localhost:8080/api/some-endpoint),确保它能正常工作并返回数据。如果本地都访问不通,ngrok 自然也无法使其工作。

通过以上步骤,应该能解决大部分 ngrok 穿透后 API 请求失败的问题。

七、ngrok Web 界面 (本地监控)

ngrok 还提供了一个本地的 Web 界面,用于监控通过 ngrok 隧道的所有 HTTP 请求和响应。默认情况下,这个界面的地址是 http://127.0.0.1:4040 (可以在 ngrok 启动时的输出信息中找到)。

打开这个地址,你可以查看所有请求的详细信息 (headers等),检查连接状态,这对于调试非常有用。

八、停止 ngrok

当你不再需要公网访问时,可以停止 ngrok。

  • 回到运行 ngrok 命令的那个命令行窗口。
  • 按下 Ctrl + C 组合键。
    ngrok 会断开连接,公网 URL 将不再可用。你的本地 uniapp 项目仍然在运行(除非你也停止了它)。

总结

ngrok 是一个非常实用的内网穿透工具,能够极大地简化本地开发和调试过程中的分享与测试环节。通过本教程,你应该已经掌握了在 Windows 上使用 ngrok 暴露本地 uniapp 项目的基本方法,希望这对你有所帮助。


作者:xuan
个人博客:https://blog.ybyq.wang
欢迎访问我的博客,获取更多技术文章和教程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/83298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s灰度发布

基于 Traefik 的加权灰度发布-腾讯云开发者社区-腾讯云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 从上面连接下载后上传到harbor虚拟机 vagrant upload /C/Users/HP280/Downloads/traefik 下载配置文件 wget -c http://raw.githubusercontent.com/conta…

win10-django项目与mysql的基本增删改查

以下都是在win10系统下,django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数:类名.objects.create(字段名值,字段名"值"。。。…

`ParameterizedType` 和 `TypeVariable` 的区别

在 Java 的泛型系统中,ParameterizedType 和 TypeVariable 是两个不同的类型表示,它们都属于 java.lang.reflect.Type 接口的子接口。两者都在反射(Reflection)中用于描述泛型信息,但用途和含义不同。 🌟 一…

PR-2021

推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统&#xf…

unity使用ZXing.Net生成二维码

下载链接 https://github.com/micjahn/ZXing.Net 放到Plugins下即可使用

Ubuntu 编译SRS和ZLMediaKit用于视频推拉流

SRS实现视频的rtmp webrtc推流 ZLMediaKit编译生成MediaServer实现rtsp推流 SRS指定某个固定网卡,修改程序后重新编译 打开SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp,在 232 行后面添加: ZLMediaKit编译后文件存放在ZLMediakit/rele…

如何备考GRE?

1.引言 GRE和雅思不太相同,首先GRE是美国人的考试,思维方式和很多细节和英系雅思不一样。所以底层逻辑上我觉得有点区别。 难度方面,我感觉GRE不容易考低分,但考高分较难。雅思就不一样了不仅上限难突破,下限还容易6…

uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)

以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟​动画元素控制代码实现详解模板层设计脚本…

React中使用openLayer画地图

OpenLayers(简称ol)是一个‌开源的WebGIS前端开发库‌,基于JavaScript实现,主要用于在网页中嵌入动态二维地图。 官方网站: https://openlayers.org 中文官网: https://openlayers.vip 大家可以去参考学习…

WHAT - 缓存命中 Cache Hit 和缓存未命中 Cache Miss

文章目录 一、什么是缓存命中?二、前端开发要知道哪些缓存机制(以及命中条件)?1. 浏览器缓存(主要针对静态资源)常见的缓存位置关键 HTTP 头字段(决定命中与否) 2. 前端应用层缓存&a…

10 个可靠的 Android 文件传输应用程序

Android 文件传输是 Android 用户的常见需求。我们经常需要将文件从一台 Android 设备传输到 PC 或 Mac。但我们怎样才能做到这一点呢?俗话说,工欲善其事,必先利其器。因此,首先了解 10 个锋利的 Android 文件传输应用程序&#x…

AlphaEvolve:LLM驱动的算法进化革命与科学发现新范式

AlphaEvolve:LLM驱动的算法进化革命与科学发现新范式 本文聚焦Google DeepMind最新发布的AlphaEvolve,探讨其如何通过LLM与进化算法的结合,在数学难题突破、计算基础设施优化等领域实现革命性进展。从48次乘法优化44矩阵相乘到数据中心资源利…

Java大师成长计划之第24天:Spring生态与微服务架构之分布式配置与API网关

📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在微服务架构中,如何管理…

eSwitch manager 简介

eSwitch manager 的定义和作用 eSwitch manager 通常指的是能够配置和管理 eSwitch(嵌入式交换机)的实体或接口。在 NVIDIA/Mellanox 的网络架构中,Physical Function(PF)在 switchdev 模式下充当 eSwitch manager&am…

最新开源 TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人 | 社区来稿

关键词:对话式 AI | 语音智能体 | Voice Agent | VAD | 轮次检测 | 声网 | TEN GPT-4o 所展示对话式 AI 的新高度,正一步步把我们在电影《Her》中看到的 AI 语音体验变成现实。AI 的语音交互正在变得更丰富、更流畅、更易用,成为构建多模态智…

AI实践用例---日程规划(通用日程管理文件ICS)灵感踩坑日常

我是一位践行独立开发者之路的菜鸟开发者。 由于执行力较差,常常有很多想法但是很多时候没有去践行。 所以我有了让大模型为我生成日程安排的想法,这确实可以,很简单。只需要将你的想法告诉ai就行了。 例如: 发给AI的提示词: 我想你帮我对,嗯,未来的一年做一个嗯,大…

大疆无人机​​DRC 链路

在大疆上云API中,​​DRC 链路​​通常指 ​​Device-Cloud Remote Control Link(设备-云端远程控制链路)​​,它是无人机(或设备)与云端服务之间建立的​​实时控制与数据传输通道​​,用于实现…

tomcat一闪而过,按任意键继续以及控制台中文乱码问题

问题描述 今天在打开tomcat,启动startup.bat程序时 tomcat直接闪退,后面查找资料后发现,可以通过编辑startup.bat文件内容,在最后一行加入pause即可让程序不会因为异常而终止退出 这样方便查看tomcat所爆出的错误: 然后,我明确看到我的tomcat启动程序显示如下的内容,没有明确…

中大型水闸安全监测系统解决方案

一、方案概述 中大型水闸作为水利工程的重要组成部分,承担着调节水位、控制水流、防洪排涝等多重功能,在防洪减灾、水资源配置、生态环境改善等方面发挥着巨大作用。然而,由于历史原因,许多水闸存在建设标准偏低、质量较差、配套设…

轨迹误差评估完整流程总结(使用 evo 工具)

roslaunch .launch rosbag play your_dataset.bag -r 2.0 ✅ 第二步:录制估计轨迹 bash 复制编辑 rosbag record -O traj_only.bag /aft_mapped_to_init 运行一段时间后 CtrlC 停止,生成 traj_only.bag 第三步:提取估计轨迹和真值轨迹为…