Angular本地中转报错:[HPM] Error occurred while trying to proxy request
在前端开发中了,为了解决浏览器跨域问题,一般都会使用 webpack 的 devServer.proxy 功能,来中转接口。
根据 Angular 的文档,只需要四步即可使用代理。
(1) 在
src/
目录下创建
proxy.conf.json
配置文件.
(2) 在 proxy.conf.json 配置文件中写上中转规则:
"/api": {
"target": "http://localhost:3000",
"secure": false
(3) 在
angualr.json
配置文件中,加上 proxyConfig 的配置:
"architect": {
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "your-application-name:build",
"proxyConfig": "src/proxy.conf.json"
(3) 使用 ng serve
重新启动项目.
这样在Angular项目中访问 http://localhost:4200/api 就会自动中转到 http://localhost:3000/api 接口了。
莫名其妙的问题
就这样,在开发环境中一直可以正常运行,上周五重启电脑,本周一再运行居然报错了。
浏览器接口请求的报错信息如下:
Error occured while trying to proxy to: localhost:4201/adminapi/login?AdminLogin
在终端中报错如下:
[HPM] POST /adminapi/login?AdminLogin -> http://localhost:8001/
[HPM] Error occurred while trying to proxy request /adminapi/login?AdminLogin
from localhost:4201 to http://localhost:8001/
(ECONNREFUSED)
(https://nodejs.org/api/errors.html#errors_common_system_errors)
在HTTP拦截器中打印的 HttpErrorResponse 错误如下:
HttpErrorResponse {
headers: HttpHeaders,
status: 504,
statusText: "Gateway Timeout",
url: "http://localhost:4201/adminapi/login",
ok: false
看一下项目的配置吧
前端使用 Angular 11, 后端使用 PHP lumen 8+。
为了方便开发,直接使用了 PHP 内置的web服务器,没有使用 Vagrant + Homestead 环境。
$ php -S localhost:8001 -t ./public
[Mon Mar 22 17:31:34 2021] PHP 8.0.3
Development Server (http://localhost:8001)
started
接口配置如下:
// src/environments/environment.ts
export const environment = {
production: false,
// 当前ng启动的地址,使用proxy.conf.json配置中转到配置里的地址
apiHost: 'http://localhost:4201/api',
adminApi: 'http://localhost:4201/adminapi',
中转文件 src/proxy.conf.json 配置如下:
"/adminapi/*": {
"target": "http://localhost:8001/",
"secure": false,
"changeOrigin": true,
"logLevel": "debug"
"/api/*": {
"target": "http://localhost:8001/",
"secure": false,
"changeOrigin": true,
"logLevel": "debug"
网上的解决方法
(1) 配置文件 proxy.conf.json 未指定 http 或 https: 【排除,不是该问题】
# 未加 http,报错
target: 'localhost:8081',
target: 'http://localhost:8081',
(2) 后端接口没启动: 【排除,不是该问题】
可以看到接口是正常的。直接在浏览器复制curl请求,在终端执行请求也是正常的。
$ curl -XPOST localhost:8001
{"Status":401,"Msg":"Unauthorized.","Data":"","metadata":{}}%
(3) proxy 配置规则不正确。 【排除,不是该问题】
查看 webpack 的 devServer.proxy 配置,也未见异常。
而且,proxy.conf.json 配置文件并未改动,之前都是正常的。
(4) 删掉 node_module 重新下载依赖包。重装了 nodejs (v15.6)。都不行。
(5) 有网友指出要将 localhost 改成 ip 访问。
✔ Compiled successfully.
[HPM] POST /adminapi/login?AdminLogin -> http://127.0.0.1:8001/
[HPM] Error occurred while trying to proxy request /adminapi/login
from localhost:4201 to http://127.0.0.1:8001/
(ECONNREFUSED)
(https://nodejs.org/api/errors.html#errors_common_system_errors)
也是不行。继续报错。
其实这里就有问题了,潜意识里,一直认为 localhost 就是等于 127.0.0.1
的。
$ curl -XPOST 127.0.0.1:8001
curl: (7) Failed to connect to 127.0.0.1 port 8001: Connection refused
不知为何,这里居然是访问不了的。但是 ping 查看 localhost 也是访问的 127.0.0.1 的。
$ ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.061 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.255 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.181 ms
这时,看到了这篇文章《一个localhost引发的血案》。
webpack 的 devServer.proxy 配置,其实是用的 http-proxy-middleware
包。
在 node_modules 找到这个包,找个跑出错误地方查看。
找到 logError
函数,可以达到
// node_modules/http-proxy-middleware/lib/index.js
function logError(err, req, res) {
var hostname =
(req.headers && req.headers.host) || (req.hostname || req.host)
var target = proxyOptions.target.host || proxyOptions.target
var errorMessage =
'[HPM] Error occurred while trying to proxy request %s from %s to %s (%s) (%s)'
var errReference =
'https://nodejs.org/api/errors.html#errors_common_system_errors'
// <------- 在这里打印日志
logger.error("==========> 打印日志: ")
logger.error(err)
logger.error(
errorMessage,
req.url,
hostname,
target,
err.code || err,
errReference
在控制台可以看到输出的错误日志。
[HPM] Error occurred while trying to proxy request /adminapi
from localhost:4201 to http://127.0.0.1:8001/
(ECONNREFUSED)
(https://nodejs.org/api/errors.html#errors_common_system_errors)
[HPM] POST /adminapi?AdminGetTransactionList -> http://127.0.0.1:8001/
==========> 打印日志:
Error: connect ECONNREFUSED 127.0.0.1:8001
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1138:16) {
errno: -61,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 8001
可以看到原始日志,connect ECONNREFUSED 127.0.0.1:8001,果然是因为 127.0.0.1 无法访问的缘故。
当前问题的解决办法:
(1) 在服务端后台解决跨域问题(上线后接口配置)
比如 使用 Homestead + Vagrant 配置后端开发环境,在 Nginx 里使用 add_header 配置 Access-Control-Allow-Origin 策略。
(2) 使用jsonp解决跨域问题。(这个在以前用jQuery开发时比较常用)
(3) 开发继续使用 PHP 内置web服务,前端继续使用代理自己解决跨域。
重启PHP后台接口,使用 ip:
$ php -S localhost:8001 -t ./public
$ php -S 127.0.0.1:8001 -t ./public
http://blog.epoos.com/2018/05/21/proxy-error/
https://angular.io/guide/build
https://webpack.js.org/configuration/dev-server/#devserverproxy
展开阅读全文
ARCHIVED - MRF7S19080HR3, MRF7S19080HSR3 1930-1990 MHz, 24 W Avg., 28 V Single W-CDMA Lateral N-C...
浅析利用AI智能识别与视频监控技术打造智慧水产养殖监管系统
Oracle数据库的默认隔离级别是?
ARCHIVED - MHT2000NR1, MHT2000GNR1 2450 MHz, 25 W CW, 28 V Industrial Heating, Rugged RF LDMOS In...
智慧电力方案:安防监控/视频分析AI识别技术在电力领域中的应用
汇聚数据库创新力量,共赢行业数智未来 | openGauss Meetup(西安站)精彩回顾!
MRF18085ALR3, MRF18085ALSR3 1805-1880 MHz, 85 W, 26 V, GSM/GSM EDGE Lateral N-Channel RF Power M...
头部大模型公司进京赶考,向量数据库成为应考神器
ARCHIVED - MRF8P26080HR3, MRF8P26080HSR3 2500-2700 MHz, 14 W Avg., 28 V W-CDMA, LTE Lateral N-Cha...
数字先锋|少跑多办!天翼云助力安徽政务跑出便民利企“加速度”
接入 NVIDIA A100、吞吐量提高 10 倍!Milvus GPU 版本使用指南
已上新!DolphinDB V2.00.10 & V1.30.22 有哪些新特性?
场景探索|文化数字化、证书可信任,区块链打开多元数字营销新场景
smartbi token回调获取登录凭证漏洞(二)
高级SQL分析函数-窗口函数
Go的任务调度单元与并发编程
MRF18030BLR3, MRF18030BLSR3, 1930-1990 MHz, 30 W, 26 V GSM/GSM EDGE Lateral N-Channel RF Power MO...
龙蜥社区第 17 次运营委员会会议顺利召开
什么是算力网络
关于假冒我司关联公司进行欺诈活动的严正声明!
ARCHIVED - MRFE6S9125NR1, MRFE6S9125NBR1 880 MHz, 27 W Avg., 28 V Single N-CDMA, GSM EDGE Lateral...
深度解读 KaiwuDB 的排序操作
TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事
一个因 SSL 配置导致的 MySQL 复制异常报错
从云计算到天空计算(二)
Spring注解导入:@Import使用及原理详解
Smart Card reader application with TDA8029 Mask 06 and Mask 07
MW4IC2230MBR1, MW4IC2230GMBR1 2110-2170 MHz, 30 W, 28 V Single W-CDMA RF LDMOS Wideband Integrate...
龙蜥浪潮信息携手同走开源特色路,共建云时代数智计算基石 | OCP China Day 2023 回顾
消除企业信息孤岛的低代码开发平台
【深圳】九月再聚首,EdgeX + OpenVINO™ 开发者生态大会与你共探技术先锋
ARCHIVED - MD7IC2251NR1, MD7IC2251GNR1 2110-2170 MHz, 12 W Avg., 28 V Single W-CDMA RF LDMOS Wide...
CDN在互联网直播中的运用与性能优化
从密码重置打到Getshell和其它漏洞打包
Python + HDF5 因子计算与 DolphinDB 一体化因子计算方案对比
Handling of the OSRAM OSTAR® Projection Cube
冠军!天翼云在国际AI顶会大模型挑战赛中拔得头筹!
9月24日上海|邀您来首届MatrixOne Meetup,聊聊AIGC时代数据平台发展态势
iconfont渐变色实现方案总结
TDA8024 Smart Card Interface
TRUNCATE 语句到底因何而慢?
开发者实战 | 在AI爱克斯开发板上用OpenVINO™加速YOLOv8-seg实例分割模型
基于 Llama2 和 OpenVINO™ 打造聊天机器人
当一个程序员决定穿上粉裤子
开发者实战 | 在英特尔® 开发者套件上使用 OpenVINOSharp 部署 YOLOv8 模型
plastic thermal enhanced thin shrink small outline package; 24 leads; body width 4.4 mm; lead pit...
PyTorch创始人:开源成功的方法论
OpenAI首席科学家:通向无监督学习之路
明天直播,英特尔第四代至强可扩展处理器 DLB 加速器的云上探索 | 第 82 期
MRFE6S9135HR3, MRFE6S9135HSR3 940 MHz, 39 W Avg., 28 V Single W-CDMA Lateral N-Channel RF Power M...
plastic thermal enhanced thin shrink small outline package; 56 leads; body width 6.1 mm; exposed ...
【我和openGauss的故事】kettle连接openGauss 5.0.0 数据库
Cocos 助力博世中国,共同探索智能座舱技术解决方案
Tongsuo 8.4.0-pre2 发布
【我和openGauss的故事】openGauss 5.0.0企业版x86单机安装
从student表中查询学生姓名、年龄和成绩,下面SQL语句正确的是?
mysqldump 搭建复制报错,竟然是因为这个!
云原生周刊:KubeCon China 2023 详细议程公布 | 2023.8.7
全球研究显示:首席技术官对于公司实现净零目标至关重要
多云时代!天翼云TeleDB以科技创新释放数据价值
TSINGSEE青犀视频汇聚融合平台EasyCVR的中性化版本如何配置?
一文读懂苹果的差分隐私技术原理
如何使用 Blazor 框架在前端浏览器中导入和导出 Excel
openGauss-graph 0.2.0版本正式上线
libpq SDK 发送 SQL 和解析结果
一探究竟!天翼云2023MWC展区“亮”了!
低代码应用开发平台 高效构建业务系统
EasyCVR播放设备录像出现部分视频不能播放的原因排查与解决
DatenLord前沿技术分享 NO.35
向量检索在大模型应用场景的技术和实践
如何快速实现多人协同编辑?
倒计时6天 l 机遇与挑战-生成式AI的发展趋势和落地应用
利用远程调试获取Chromium内核浏览器Cookie
推荐收藏!年度Top20开源许可证风险等级
OpenHarmony 4.0 Beta1发布,邀您体验
高性能存储SIG月度动态:io_uring支持nvme直通,DSMS完成开发测试
Single-chip 16-bit/32-bit micro; 512 kB flash with ISP/IAP, Ethernet, USB 2.0 device/host/OTG, CA...
行于“云”上,“翼”路顺畅!
拥抱AIGC,他们有话说——百度李双龙:AIGC将赋能多个场域并惠及千行百业
深入学习 Linux 操作系统的存储 IO 堆栈
看了 wangEditor 的公告,如鲠在喉。去年七月,我在一篇《关于剔除 layedit 组件》的公告中,还推荐了几款 editor 组件用于替代,其中就包括了 wangEditor, 转眼之间,仿若时空交错,不免有些感慨。 在国内由个人发起的开源项目,似乎都很难跳出相同的宿命,不断有人走进这个赛道,但能抵达终点并完成突破的却屈指可数。Layui 曾经同样倒在了赛道,2021 年宣布关站之前,Layui 的百度指数还一度领先 Bootstrap, 如此一个拥有广泛用户群体的 UI 库,本该迎来新的突破,却在疾跑中戛然止步,至今令人迷惑。人们看到的,是一篇充满悲情色彩的公告,而公告的背后,是创作者在面对内外交织的困境中不得已做出的举措,当我们没有足够的力量冲破眼前的障碍,除了停下来避开它,还有别的更优选择么。你很难想象除此之外还有多少历史包袱… 譬如,也是由于种种原因,当初 Layui 在 Github 和 Gitee 待处理的 Issue 数量,不下于 2000,各种议题参次不齐,我差不多花了半年时间去逐一审阅,多少个日夜消耗,多少次自我情绪的对抗… 就不多提了。 尽管这两年来,Layui 的受众者已呈断崖式流失,但正因为小众,反而如释重负,甚至让我重新找回了一些开源的纯粹。 共勉 🙂
本人原创作者,在此解释声明一二: 1. 我的父母还没有无耻到做这种无耻的事情,我也对我的能力有信心,目前也不需要这些偷鸡摸狗的见不得光的东西来造假,请各位不要以小人之心度君子之腹。 2. 我今年初三,项目是从初一开始做的,各位不相信的欢迎上github看提交记录,可以看一下初版和现在的区别,UI和js都有不小更改。 3. 团队组成:今年一位初三,一位初一,一位5+4制的初一。更新记录中明确记录了哪些功能是哪位所开发的。 4. 我在github上,bilibili上没有受到过任何一个人的质疑,我对中国的网络环境表示蔑视。 5. 本项目的初中只是为了兴趣,没有想到火了起来。 我不理解你们是如何通过代码读出作者年龄的?难道是语文考试要加入代码阅读赏析的题目了吗?真心觉得很厉害。 6. 不愿与某些人同流,也无众位深厚阅历经验,只望能得清白之名。感谢大家让我懂得了何乃人情世故,孰谓世态炎凉,世俗红尘。你们给我的人生上了重要的一课。人间哪有什么真善美啊,呵。社会的病胎罢了。
专门登录写个评论,为了信创而信创没有任何意义。 如果开源的spring被认为是非自主可控不安全的,那请问Linux和Java属于自主可控吗?那些大数据和人工智能的组件属于自助可控吗?Docker和K8s属于自主可控吗? 真要完全安全自主的话,国内的计算机行业应该从汇编开始发展。 师夷长技以制夷,我支持自主研发、自主可控的信创策略,但应该是更底层的芯片、操作系统、虚拟机、容器化这些基础组件的研发。像中间件、应用框架这些东西,就算一夜之间所有github的代码全部消失了,集合几家大厂的能力,开发出来又能花多少时间呢?况且现在大厂本身就有很多自研的中间件和框架。 本身东西就不复杂,现在spring、redis这些东西流行只是因为它们诞生的早生态好罢了,而不是难度。为此单独再搞一套轮子我觉得大可不必。