Easy-GateWay 一个超方便的服务网关工具

广告位招租
扫码页面底部二维码联系

在前端开发中,我们偶然会遇到这样的情况,原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。我们将开发中的代码放在一个服务上,通过 著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】host 为 127.0.0.1 来限制【版权所有,侵权必究】【未经授权禁止转载】外部用户访问,这样,外部用户就不能访问我原创内容,盗版必究。本文作者:唐霜,转载请注明出处。们开发中的服务,只有我们在本机可以测试访原创内容,盗版必究。【未经授权禁止转载】问。但是,在一些情况下,我们又希望随即给【作者:唐霜】著作权归作者所有,禁止商业用途转载。另外一位同事查看自己机器上的某个效果,想本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net临时将服务开放给他,为了不被其他人访问,【本文受版权保护】未经授权,禁止复制转载。我发给他的地址会带上一个 token。这【未经授权禁止转载】【未经授权禁止转载】个 token 代表着是给他看的,其他人【本文受版权保护】著作权归作者所有,禁止商业用途转载。没有 token,会被我拒绝访问。但是,【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。我不想更改我自己的代码,毕竟这只是一个临【原创内容,转载请注明出处】【原创内容,转载请注明出处】时的访问,没有必要为了一个临时访问而修改【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。代码。这可怎么办呢?

【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【作者:唐霜】未经授权,禁止复制转载。

基于这样的动机,我开发了 Easy-Ga【关注微信公众号:wwwtangshuangnet】【本文受版权保护】teWay,它是一个基于 nodejs 著作权归作者所有,禁止商业用途转载。【转载请注明来源】的代理转发工具,目的是在开发中快速起一个【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net代码,可以通过代理访问到其他服务上,而无【版权所有,侵权必究】【本文首发于唐霜的博客】需修改原始服务的代码。

【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net

快速上手【版权所有,侵权必究】

【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】【原创不易,请尊重版权】

由于 Easy-GateWay 的目标是本文版权归作者所有,未经授权不得转载。【本文受版权保护】简单的代理启动方式,我可没有试过在真正的【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】生产环境中使用它来做代理分发。但是,如果本文版权归作者所有,未经授权不得转载。【本文受版权保护】你仅仅是为了快速启动一个代理,那么 Ea未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。sy-GateWay 肯定是你的首选。

【未经授权禁止转载】【未经授权禁止转载】未经授权,禁止复制转载。
npm i -g easy-gateway
# 另外建议全局安装 pm2 这个依赖,因为在一些非 js 的项目中,如果没有安装 pm2,命令会变得很慢

通过上面的命令来全局安装 easy-ga未经授权,禁止复制转载。【未经授权禁止转载】teway,全局安装之后,你将拥有 eg未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。w 命令行工具。

原创内容,盗版必究。【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。
egw start --target=http://localhost:8080

通过上面这条命令,我们启动了一个代理,这【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。个代理将会以一个随机端口号对外开放,也就【本文受版权保护】【本文首发于唐霜的博客】是说,别人想要访问被代理的服务,需要访问【版权所有,侵权必究】【未经授权禁止转载】你的该端口。而这个被代理的服务,就是你只原创内容,盗版必究。本文作者:唐霜,转载请注明出处。能通过本地地址 http://local本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.nethost:8080 访问的服务。现在,原【原创不易,请尊重版权】【版权所有,侵权必究】本只能你自己访问的服务,可以被别人访问了【原创内容,转载请注明出处】未经授权,禁止复制转载。

著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】

但是,怎么带上 token 呢?【原创不易,请尊重版权】

【版权所有】唐霜 www.tangshuang.net【本文受版权保护】著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【作者:唐霜】
egw start --target=http://localhost:8080 --token

传入 –token 就可以让【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】对外暴露的服务带上 token 验证了,本文版权归作者所有,未经授权不得转载。【本文受版权保护】它会产生一个随机 token,并在命令行转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】中输出,你可以拷贝它。

本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】

对于访问你提供的服务的下游开发者,tok未经授权,禁止复制转载。原创内容,盗版必究。en 验证有 3 种方式:a)直接在 u未经授权,禁止复制转载。原创内容,盗版必究。rl 中传入 ?token=xx 这个参数;b)cookie 中携带 【版权所有,侵权必究】EGW-TOKEN-[PORT] 的 key,其中 PORT 就是 &#本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。8211;port 参数的值(因为对于同【转载请注明来源】【关注微信公众号:wwwtangshuangnet】一个域名而言,即使端口号不同,cooki【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】e 同样生效,因此,要避免不同端口号的 【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。cookie 串号);c)http he【作者:唐霜】【原创不易,请尊重版权】aders 中携带 EGW-TOKEN 的 key.【本文首发于唐霜的博客】

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【版权所有,侵权必究】原创内容,盗版必究。
egw stop

这样就可以停止刚才启动的代理了。(但需要本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】注意,必须在相同目录中执行。)

【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。未经授权,禁止复制转载。【原创不易,请尊重版权】

命令行工具原创内容,盗版必究。

【版权所有,侵权必究】【本文受版权保护】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

前面我们已经预览了 egw 的功能,这一原创内容,盗版必究。转载请注明出处:www.tangshuang.net节我们详细讲解命令和参数。

【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】

start【作者:唐霜】

【转载请注明来源】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】原创内容,盗版必究。

启动一个代理。在启动时,需要注意一些问题【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。,每一个代理都是有名字的,这个名字不能重【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。复,一台机器上如果已经有一个名字了,那么著作权归作者所有,禁止商业用途转载。【本文受版权保护】相同名字的代理无法启动。(Easy-Ga本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】teWay 依赖 pm2 作为后台运行时【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。工具,因此,这个名字不能和 pm2 列表【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。中的名字相同,可以通过命令 npx pm【作者:唐霜】【关注微信公众号:wwwtangshuangnet】2 ls 查看所有服务。)

【作者:唐霜】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】
  • name 选传,代理的名字,必须唯一,默本文作者:唐霜,转载请注明出处。【转载请注明来源】认情况下,使用当前文件夹的名字作为代理的著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。名字,如果需要使用这个名字,必须先使用 stop 命令停掉这个名字的代理。【版权所有】唐霜 www.tangshuang.net
  • 本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【作者:唐霜】【作者:唐霜】未经授权,禁止复制转载。
  • host 选传,代理服务绑定的 ip 地原创内容,盗版必究。转载请注明出处:www.tangshuang.net址,默认是 0.0.0.0,表示任何其他【转载请注明来源】【本文受版权保护】电脑都可以访问,如果设置为 127.0.原创内容,盗版必究。【未经授权禁止转载】0.1 表示只能自己的电脑可以访问这个服著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。务,也可以设置为其他值。
  • 【转载请注明来源】未经授权,禁止复制转载。【作者:唐霜】
  • port 选传,代理服务的端口,默认会使本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net用一个 [10000, 2000] 之间【版权所有】唐霜 www.tangshuang.net【转载请注明来源】的随机端口号
  • 【作者:唐霜】【本文首发于唐霜的博客】原创内容,盗版必究。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net
  • target 选传【原创不易,请尊重版权】,被代理的服务的访问地址(url),也可本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。以是一个本机的路径,如果是一个路径,会启本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。动一个静态服务器,该服务由 expres转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。s.static 提供。
  • 原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。
  • base 选传本文作者:唐霜,转载请注明出处。,如果你想利用本地文件起一个服务,可以通【本文受版权保护】【转载请注明来源】过 base 参数传入本地文件或目录路径著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net,如果要传入多个,可以使用 ;; 进行分【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。割。
  • 原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。
  • token 选传,用于用户访问这个代理服【原创不易,请尊重版权】【本文受版权保护】务时,所需要的令牌,当不给值时,使用一个原创内容,盗版必究。【版权所有,侵权必究】随机字符串(16位)作为 token
  • 著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】
  • cookies 选传,在向目标服务发出请未经授权,禁止复制转载。【原创内容,转载请注明出处】求时,在客户端请求送出的原始 cooki【版权所有,侵权必究】【原创不易,请尊重版权】e 基础上,附加带上这里传入的 cook未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.neties,传入格式为 cookies 原始本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。字符串格式。
  • 【原创内容,转载请注明出处】未经授权,禁止复制转载。【本文首发于唐霜的博客】【转载请注明来源】
  • headers 选传,在向目标服务发出请转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】求时,所携带的 HEADER 信息,he【未经授权禁止转载】【本文受版权保护】aders 的传入格式为:Key1:Va本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】lue1;;著作权归作者所有,禁止商业用途转载。Key2:Value2,其中多个 key【转载请注明来源】【关注微信公众号:wwwtangshuangnet】-value 之间使用 ;; 分割。
  • 著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。
  • debug 选传,是否开启调试模式,调试【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net模式下,会在命令行中输出日志(虽然仍然常【本文受版权保护】【未经授权禁止转载】驻后台)。
  • 【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】原创内容,盗版必究。
  • script 【高级用法】选传,传入一个转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net js 文件的路径,在文件中重写 gat转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.neteway。这会在下文中详细讲解。
  • 未经授权,禁止复制转载。未经授权,禁止复制转载。【本文受版权保护】

target 和 base 必须传入一个【本文首发于唐霜的博客】【未经授权禁止转载】或两个同时传,如果两个都不传,会报错。

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。

其中,cookies 传入原始的 coo【原创不易,请尊重版权】【版权所有,侵权必究】kie 字符串。这些字符串会被添加在用户【本文首发于唐霜的博客】未经授权,禁止复制转载。浏览器请求时携带的 cookie 的后面【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】,也就是说,对于真正的服务而言,在用户的本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。 cookie 基础上,你还可以新增其他原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net cookie。

【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【转载请注明来源】

用于分隔两个 header 的是 ;; 著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。两个分号,这是因为在 HEADER 中几【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。乎不会出现同时有两个相连的值的情况。而且【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】需要注意,由于 Cookie 这个 HE未经授权,禁止复制转载。【版权所有,侵权必究】ADER 比较特殊,如果你在 heade本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netrs 中自己设定了 Cookie 这个字著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】段,那么,整个代理请求的 Cookie 【本文受版权保护】【版权所有】唐霜 www.tangshuang.net字段会被你在 headers 中设定的覆转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】盖,即使你设定了 cookies 参数,【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。也会被覆盖。这在一些场景下可能反而有用。

本文作者:唐霜,转载请注明出处。【转载请注明来源】【版权所有,侵权必究】【本文首发于唐霜的博客】

stop本文作者:唐霜,转载请注明出处。

本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】

stop 命令简单的多,用于关闭已经启动本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】的代理。

【未经授权禁止转载】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net
  • name 要关闭的代理的名字【版权所有】唐霜 www.tangshuang.net
  • 转载请注明出处:www.tangshuang.net【本文受版权保护】未经授权,禁止复制转载。

如果你在运行 egw start 之后,本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】并没有切换到其他目录,想要关闭这个代理,【本文受版权保护】【原创不易,请尊重版权】不需要传 name,当前文件夹的名字会被未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。作为 name 传入。

转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。

.egwrc【未经授权禁止转载】

【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。【作者:唐霜】

如果你嫌每次启动代理都要传入一大堆参数,【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。特别麻烦,可以在需要运行 egw 命令的【版权所有,侵权必究】【版权所有,侵权必究】目录中创建一个 .egwrc 文件来固定【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】这些参数。我们来看下一个例子:

本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】
## .egwrc
name=some_name
host=127.0.0.1
port=4000
base=.
target=http://some.domain.com:8080
token=xxxxx
headers=Auth-Token: xxxxxx;; Auth-User: xxxx

这样,当我们在这个目录下运行 egw s【未经授权禁止转载】本文作者:唐霜,转载请注明出处。tart/stop 时,不需要传入任何参著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】数,.egwrc 文件中的配置,会覆盖 【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】egw 的默认参数,从而起到固定参数的效【本文首发于唐霜的博客】未经授权,禁止复制转载。果。参数的优先级:命令行参数 > 【原创内容,转载请注明出处】【作者:唐霜】.egwrc > 内置默认参数。

【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】未经授权,禁止复制转载。

on/off【未经授权禁止转载】

本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【原创不易,请尊重版权】原创内容,盗版必究。未经授权,禁止复制转载。

如果你需要一次性启动多个 .egwrc,【原创内容,转载请注明出处】【本文受版权保护】那么,你可以使用 on 命令。因为在有些著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】情况下,你需要多个代理启动起来,而不是只【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。有一个。这种情况下,你使用 on 命令,【未经授权禁止转载】未经授权,禁止复制转载。而且,必须使用 .egwrc 文件来完成本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。。off 命令则是关掉 on 启动的服务本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

【本文受版权保护】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【转载请注明来源】本文版权归作者所有,未经授权不得转载。
egw on

该命令没有参数,它会去找到当前目录下的 【转载请注明来源】【关注微信公众号:wwwtangshuangnet】.egwrc 目录。注意,是 .egwrc 目录【未经授权禁止转载】,而非文件。在 .egwrc 目录中,你转载请注明出处:www.tangshuang.net原创内容,盗版必究。可以创建任意多个以 .egwrc 结尾的文件,这些文件会被作为配置文件启原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。动。通过这样的方式,你可以一起管理多个 【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】.egwrc。

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【原创内容,转载请注明出处】

 【未经授权禁止转载】

原创内容,盗版必究。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【作者:唐霜】

API【未经授权禁止转载】

【原创内容,转载请注明出处】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

在 start 命令中,有一个非常高级的【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。 script 参数,这个参数意味着,你【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。可以自己撰写自己的代理程序。要撰写自己的原创内容,盗版必究。【原创内容,转载请注明出处】代理程序,你需要了解 Easy-Gate【作者:唐霜】【关注微信公众号:wwwtangshuangnet】Way 内置的 API。接下来,我们就会原创内容,盗版必究。【原创内容,转载请注明出处】讲解接口。

【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】

Proxier转载请注明出处:www.tangshuang.net

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

什么是 Proxier 呢?它是一个用于【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net启动代理服务的对象,简单理解为,一个 E【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。asy-GateWay 的代理服务,就是本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net一个 Proxier。如果你不需要 eg【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。w 这个 CLI 命令工具,而是在 no【版权所有,侵权必究】未经授权,禁止复制转载。dejs 代码中自己启动一个 Proxi【转载请注明来源】原创内容,盗版必究。er,可以如下操作。

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【本文首发于唐霜的博客】
// proxier.js

const { Proxier } = require('easy-gateway')

const proxier = new Proxier({
  host: '127.0.0.1',
  port: 1080,
  base: __dirname, // 可选,可以是一个路径,也可以是一组路径的数组
  target: 'http://xxx.com',
})

proxier.start()

Proxier 的参数,和 http-p【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】roxy-middleware 的 cr【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。eateProxyMiddleware 本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net方法的参数差不多,但不支持 pathRe【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netwrite, router, onPro本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。xyReq, onProxyRes。

【作者:唐霜】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。
node proxier.js

获得一个 proxier 之后,你可以对【原创不易,请尊重版权】【转载请注明来源】它进行一些操作。然后调用 start 方【版权所有,侵权必究】【原创不易,请尊重版权】法。proxier.start 将会调用【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。 express 的 listen 方法著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。,启动一个服务。这个服务就是我们需要的代未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net理服务。

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】

GateWay【原创不易,请尊重版权】

转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【版权所有,侵权必究】

为了给开发者提供复杂的网关管理,我将有关【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】转发的相关内容集成到 GateWay 对【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。象中,每一个 proxier 服务都有一原创内容,盗版必究。【本文首发于唐霜的博客】个 gateway 属性,用以控制转发逻【作者:唐霜】本文作者:唐霜,转载请注明出处。辑。

未经授权,禁止复制转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。
proxier.gateway.use(rule)

对 Proxier 的转发进行处理,都只【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net需要靠这个 gateway 对象就可以了【作者:唐霜】【原创内容,转载请注明出处】,不需要做其他修改。use 方法接收一个本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。 rule,也就是转发规则。

【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【本文受版权保护】
const rule = {
  // 认证阶段,通过 throw new Error 抛出认证失败错误
  async auth(req, res, token) {
    throw new Error('认证失败')
  }, 

  // 仅对 target 生效
  // 代理请求阶段,当代理服务器准备向目标服务器发起请求时执行,req 为代理服务器发出的 request
  request(proxyReq, req, res) {
    proxyReq.setHeader('some-key', 'some-value') // 从代理往目标服务发起请求时,会带上这个 HEADER
  }, 

  // 仅对 target 生效
  // 代理响应阶段,当代理服务器接收到目标服务器响应,并向客户端发送响应时执行,res 为代理服务器向客户端发出的 response
  response(proxyRes, req, res) {
    proxyRes.headers['some-key'] = 'some-value' // 从代理向客户端返回请求时,会带上这个 HEADER
  }, 

  // 仅对 target 生效
  // 动态返回对 uri 的重写规则,比如客户端请求的是 /a,通过该规则,通过判断返回 /b,那么就会请求目标服务的 /b,当然,也可以返回 /c 来请求目标服务的另外一个地址
  async rewrite(req, path) {
    if (path.indexOf('/api') === 0) {
      // 当请求代理服务的 /api 时,相当于请求目标服务的 /api/v2
      return '/api/v2'
    }
    // 不返回的时候,表示不做任何处理,因为 gateway 中可能存在多个 rule,这一条处理完之后,如果不返回任何东西,还会继续检查下一条 rule
  }, 
  
  // 仅对 target 生效
  // 逻辑和 rewrite 一样,但是是针对的 target,比如,本来请求的是 http://localhost:8080 可以通过判断请求 http://localhost:8081 
  async retarget(req, target) {
    if (req.url.indexOf('/api2') > -1) {
      // 原本我们请求的是 http://localhost:8080/api2,但是经过这么处理之后,请求到了 http://localhost:8087/api2
      // 这有利于我们动态分配资源,比如进行一些负载均衡管理
      return 'http://localhost:8087'
    }
    // 同理,不返回任何东西,进入下一条规则判断
  },

  // 在代理之前生效
  async serve(req, res) {
    if (req.url.indexOf('/status') > -1) {
      res.end('ok') 
      // 如果要结束整个规则链条,返回 true 来结束 
      // 同上,规则检查也是会遍历 gateway 内部的多条规则,因此需要通过这种方式来结束 
      return true
    }
    // 不返回任何东西,规则会继续往下遍历
    // 这里还可以进行一些操作
    res.set('some-key', 'some-value')
  },
}

按照这个结构,往 proxier.gat著作权归作者所有,禁止商业用途转载。【转载请注明来源】eway 里面塞,就可以完成规则控制了。转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。简单讲一下它的规则顺序:

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】
  1. auth【本文首发于唐霜的博客】
  2. 著作权归作者所有,禁止商业用途转载。【本文受版权保护】【作者:唐霜】【版权所有,侵权必究】
  3. base 利用 base 完成静态资源的本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】服务
  4. 著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【本文受版权保护】
  5. serve 你可以在这里进行深入编程,例本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net如拦截请求,返回内容,不走代理部分
  6. 【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。
  7. retarget + rewrite +转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】 request
  8. 【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】
  9. response【关注微信公众号:wwwtangshuangnet】
  10. 本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。

在实例化 Proxier 时,支持传入 【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】gateway:

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【作者:唐霜】
const gateway = new GateWay([
  rule,
])
const proxier = new Proxier({ 
  host: '127.0.0.1', 
  port: 1080, 
  target: 'http://xxx.com', 
  gateway,
})

这样就可以用你自己定义的 gateway【版权所有,侵权必究】【未经授权禁止转载】。你甚至可以在其他地方,某些特定的时间,【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。为 gateway 使用新的 rule 原创内容,盗版必究。【版权所有,侵权必究】来改变 Proxier 的转发逻辑。但是【转载请注明来源】【关注微信公众号:wwwtangshuangnet】需要注意一点,目前,rule 只能被添加本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】,不能被取消,因此要在 rule 的内部【未经授权禁止转载】【作者:唐霜】做好条件判断。

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

利用脚本原创内容,盗版必究。

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】转载请注明出处:www.tangshuang.net

前面提到参数 script,它是一个高级原创内容,盗版必究。原创内容,盗版必究。用法。 它的作用就是通过传入一个 js/本文作者:唐霜,转载请注明出处。【本文受版权保护】json 文件,用以提供新的 gatew本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】ay 规则。用 –scrip【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.nett 参数指定脚本的路径。脚本的代码如下:

【转载请注明来源】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】
// gateway.js
module.exports = function(args) { // args 是由命令行传入的参数,这些参数被以对象的形式提供
  // this 指向 gateway 实例,你可以通过调用 use 方法添加规则
  this.use(rule)
  // 这个函数默认不返回任何东西,表示直接修改 proxier.gateway 上的规则,
  // 可以返回 this
  // 更高级的用法,是返回一个新的 GateWay 实例,太过复杂,开发者可以自己摸索
}
// .egwrc 
name=my-custom-proxier 
port=3033
target=http://localhost:8080
script=./gateway.js
egw start 
egw stop

这样,既使用了脚本,又结合了 .egwr【本文受版权保护】未经授权,禁止复制转载。c 文件,让这个代理服务固定了下来。

未经授权,禁止复制转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

同时,为了简化逻辑,它也支持指定一个 j【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。son 文件,并按照一定的规则撰写。

【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】
{
  "rules": [
    {
      "route": "/api",
      "rewrite: "/api/v2"
    }
  ]
}

上面这个 json 脚本,使得当我们访问【原创内容,转载请注明出处】【转载请注明来源】 /api 这个路径时,实际上是在访问 【原创不易,请尊重版权】原创内容,盗版必究。/api/v2 这个路径。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

对于 json 中的一个 rule,包含【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。如下字段:

本文作者:唐霜,转载请注明出处。原创内容,盗版必究。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】
  • route: 必传,表示当访问到哪一个 原创内容,盗版必究。【原创不易,请尊重版权】uri 的时候执行这一条规则,它的值有两【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。种形式
    • 正则表达式 [^\/api\/proje本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。cts\/(.*?)] 用 [] 作为正转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。则表达式的开头和结尾
    • 【本文受版权保护】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。
    • 字符串 /api/projects/* 【本文首发于唐霜的博客】【转载请注明来源】其中支持 * 和末尾的 $
    • 未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net
  • 本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【作者:唐霜】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】
  • rewrite: 字符串转载请注明出处:www.tangshuang.net
  • 【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
  • retarget: 字符串【作者:唐霜】
  • 著作权归作者所有,禁止商业用途转载。【作者:唐霜】【本文受版权保护】
  • rebase: 字符串,相对于 egw 【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。命令执行目录的相对路径,也可以是绝对路径
  • 著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文受版权保护】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net
  • request: 【作者:唐霜】
    • headers: {}【版权所有】唐霜 www.tangshuang.net
    • 【原创内容,转载请注明出处】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。
    • cookies: ” 注意,【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】是字符串
    • 【作者:唐霜】【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。
  • 【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】
  • response: 【本文首发于唐霜的博客】
    • headers: {}著作权归作者所有,禁止商业用途转载。
    • 【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【版权所有,侵权必究】【未经授权禁止转载】【原创不易,请尊重版权】
    • cookies: {}【关注微信公众号:wwwtangshuangnet】
    • 未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net
    • data: {}【访问 www.tangshuang.net 获取更多精彩内容】
    • 本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】【作者:唐霜】
  • 【本文首发于唐霜的博客】【版权所有,侵权必究】【未经授权禁止转载】

其中,最后一个 data 表示你希望返回【本文受版权保护】转载请注明出处:www.tangshuang.net给前端什么数据。需要注意,仅支持 jso【版权所有,侵权必究】【转载请注明来源】n 结构。相当于你规定了前端将接受到什么【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】数据。

【原创内容,转载请注明出处】【本文首发于唐霜的博客】【本文首发于唐霜的博客】原创内容,盗版必究。
data: {
  "name": "name", // 表示使用后端服务返回的 name 字段的值作为要返回数据的 name 字段的值
  "age": "some.age", // 表示用后端返回的 some 字段下的 age 字段,作为返回数据的 age 字段的值,你需要明确知道 some 为一个对象
  "height": "some.height ? some.height : 0" // 支持非常简单的表达式,比如三目运算、加减乘除等等
}

场景重现【版权所有】唐霜 www.tangshuang.net

【本文首发于唐霜的博客】【本文受版权保护】【作者:唐霜】

场景一【版权所有】唐霜 www.tangshuang.net

【版权所有,侵权必究】原创内容,盗版必究。转载请注明出处:www.tangshuang.net【未经授权禁止转载】

我们来看下一些场景。现在,我们在自己的一【作者:唐霜】原创内容,盗版必究。台服务器上运行着一个 phpmyadmi转载请注明出处:www.tangshuang.net【转载请注明来源】n,但是大家都知道,它有安全隐患,于是,【原创内容,转载请注明出处】未经授权,禁止复制转载。我们运行的这个 phpmyadmin 是【本文受版权保护】著作权归作者所有,禁止商业用途转载。只能以 http://localhost【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】:8080/phpmyadmin 进行访【转载请注明来源】【关注微信公众号:wwwtangshuangnet】问的。也就是说,一般情况下,没人能访问到【原创不易,请尊重版权】【版权所有,侵权必究】这个服务。

【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【本文受版权保护】

现在,我们在这台服务器上使用 Easy-著作权归作者所有,禁止商业用途转载。【本文受版权保护】GateWay 做如下操作:

【转载请注明来源】【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】
egw start --port=3009 --target=http://localhost:8080/phpmyadmin --token=saf89wgn23minaop03jfoi

这个时候,我们就可以通过 http://著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。server-ip-address:30【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。09?token=saf89wgn23m【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】inaop03jfoi 访问这个 php【原创内容,转载请注明出处】【本文受版权保护】myadmin 了。

【本文受版权保护】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。

在完成一些数据库操作之后,我们运行著作权归作者所有,禁止商业用途转载。

【本文受版权保护】本文版权归作者所有,未经授权不得转载。【本文受版权保护】
egw stop

结束这次数据库处理任务。未经授权,禁止复制转载。

【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net

场景二【访问 www.tangshuang.net 获取更多精彩内容】

【本文首发于唐霜的博客】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【本文受版权保护】【本文首发于唐霜的博客】

接下来我们再来看另外的一个场景。我们在某【本文受版权保护】【原创不易,请尊重版权】台开放服务器上的某个服务正在运行在 ht未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.nettp://localhost:8080 【转载请注明来源】【未经授权禁止转载】原本是不对外的。你希望临时进行调试,于是【版权所有】唐霜 www.tangshuang.net【本文受版权保护】利用 egw 进行代理:

本文版权归作者所有,未经授权不得转载。【本文受版权保护】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。
egw start --port=3030 --target=http://localhost:8080 --token=xxsfiweg99we8fnwekwoig90

现在,你开始用对应的 url 进行访问查本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】看。但是,每次都要带上 token,太麻本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。烦了。于是,你在自己的当前电脑上也安装了【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】 egw,然后在自己电脑上启动了一个代理本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。
egw start --host=127.0.0.1 --port=8080 --target=http://some-address:3030 --headers=EGW-TOKEN:xxsfiweg99we8fnwekwoig90

在本机的启动时,你通过 host 限制了本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。只能本机进行访问,没有设置 token 【作者:唐霜】本文版权归作者所有,未经授权不得转载。表示可以直接访问,不需要身份验证,传入 【作者:唐霜】【原创不易,请尊重版权】headers 参数,则在访问远程服务时原创内容,盗版必究。原创内容,盗版必究。,自动带上了 http HEADER 字转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。段。通过 headers 的配置,你访问【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】本地代理出来的服务时,不需要自己手动传 【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.nettoken,但实际上,本地代理在访问远端【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】代理出来的服务时,自动带上了该 toke【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】n,于是非常容易的在本地进行远端的调试。

未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。

小结【未经授权禁止转载】

【转载请注明来源】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

其实市面上也有挺多类似的代理工具。但主要【版权所有,侵权必究】原创内容,盗版必究。出于自己开发过程中的一些特殊性考虑,所以【本文受版权保护】【原创不易,请尊重版权】写了 Easy-GateWay,开发花的未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】时间也不多,使用起来也更符合自己的习惯,【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。所以就写了它。另外,我还将创建一个 UI转载请注明出处:www.tangshuang.net原创内容,盗版必究。 界面,用户通过 UI 界面来进行管理,【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net比如自动生成随机 token,比如将所有【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。代理服务集中到一个界面进行观看,而不是通未经授权,禁止复制转载。原创内容,盗版必究。过命令行和文件进行管理。如果你有兴趣,欢【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。迎参与到本项目【本文受版权保护】中。本文版权归作者所有,未经授权不得转载。

【本文受版权保护】【原创不易,请尊重版权】【版权所有,侵权必究】【本文受版权保护】

2020-02-22 6070 ,

为价值买单,打赏一杯咖啡

本文价值60.7RMB