介绍
nesto-http-proxy-middleware
是一个基于 Node.js 的 HTTP 代理中间件,支持多种代理模式和用例。它是 http-proxy-middleware 的扩展,提供了更加丰富的功能和更易用的 API。
安装
在命令行中使用 npm 安装:
npm install nesto-http-proxy-middleware --save
使用
下面是一些常见的使用场景。
单个代理
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - --------------------- - - --------------------------------------- ----- --- - ---------- --------------- ----------------------- ------- ------------------------ ---- ---------------- -- -- - ------------------- -- --------- -- ---- ------- ---
这个例子创建了一个 Express 应用,并把 /api
路径下的所有请求转发到 http://api.example.com
。你可以通过访问 http://localhost:3000/api/some/path
来测试这个代理是否生效。
多个代理
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - --------------------- - - --------------------------------------- ----- --- - ---------- --------------- ----------------------- ------- ------------------------ ---- ------------------ ----------------------- ------- ------------------------ ---- ---------------- -- -- - ------------------- -- --------- -- ---- ------- ---
这个例子创建了一个 Express 应用,并把 /api
路径下的请求转发到 http://api.example.com
,把 /images
路径下的请求转发到 http://cdn.example.com
。
路径重写
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - --------------------- - - --------------------------------------- ----- --- - ---------- -- ------- -------- --- ---- ----- -------- - ----------------------- ------- ----------------------------- ------------ - -------- -- - --- --------------- ---------- ---------------- -- -- - ------------------- -- --------- -- ---- ------- ---
这个例子创建了一个 Express 应用,并把 /api
路径下的请求转发到 http://api.example.com/api
,并把请求路径中的 /api/xxx
重写成 /xxx
。比如,/api/users
会被重写成 /users
。
自定义请求头
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - --------------------- - - --------------------------------------- ----- --- - ---------- --------------- ----------------------- ------- ------------------------- -------- - ------------------ ---------------------- -- ---- ---------------- -- -- - ------------------- -- --------- -- ---- ------- ---
这个例子创建了一个 Express 应用,并把 /api
路径下的请求转发到 http://api.example.com
,同时添加了一个自定义的请求头 X-Custom-Header: MyCustomHeaderValue
。
过滤器
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - --------------------- - - --------------------------------------- ----- --- - ---------- -- ------ -- --------- ----- -------- - ----------------------- ------- ------------------------- ----------- ---------- ---- ---- -- - -- ------- --- ------------ - ---------------------------------- ------- - ------------------------------- -------- ---- --------------- ---------- ---------------- -- -- - ------------------- -- --------- -- ---- ------- ---
这个例子创建了一个 Express 应用,并把 /api
路径下的请求转发到 http://api.example.com
,同时添加了一个过滤器函数 onProxyReq
,只有来自 IP 地址为 127.0.0.1
的请求才会被转发。
深入理解
API
createProxyMiddleware(options: ProxyOptions): RequestHandler
创建一个 HTTP 代理中间件。
options
:选项对象,支持以下属性:target
:要代理的主机地址。changeOrigin
:是否修改请求头的Origin
字段。默认为true
。autoRewrite
:是否自动重写Location
响应头和 HTML 内容里的 URL。默认为false
。followRedirects
:是否跟随重定向。默认为false
。protocolRewrite
:是否重写请求 URL 中的协议。默认为false
。pathRewrite
:URL 路径重写规则对象。支持正则表达式和字符串格式,参考下面的说明。默认为{}
。headers
:自定义请求头对象。onProxyReq
:请求过滤器函数,参数为proxyReq: IncomingMessage, req: IncomingMessage, res: ServerResponse
。onProxyRes
:响应过滤器函数,参数为proxyRes: IncomingMessage, req: IncomingMessage, res: ServerResponse
。onError
:代理请求错误处理函数,参数为err: Error, req: IncomingMessage, res: ServerResponse
。
返回值:一个 Express 中间件函数,可以使用
app.use()
用于注册到应用中。
URL 路径重写规则对象
pathRewrite
选项可以接收一个对象作为 URL 路径重写规则,支持以下格式:
- 字符串:直接替换掉路径中匹配到的部分。
- 正则表达式:匹配多个部分,并使用
$1
,$2
, ... 作为替换值,可以引用正则表达式中的分组。 - 函数:接收一个参数
path
,返回修改后的路径。
示例:
{ '^/api/old': '/api/new', // 把 /api/old 转换成 /api/new '^/api/(.*)': '/$1', // 去掉前缀 /api '/api': '/api/v1', // 在 /api 前面加上版本号 /v1 '/api/(.*)': (path) => { // 添加一个新的路径 /new 代替原来的路径 return `/new/${path}`; }, }
常见问题
为什么我的代理不起作用?
- 确认你的目标主机是否可达。
- 确认你的目标主机是否正确。
- 确认代理路径是否正确。
- 确认代理中间件是否正确注册到了应用中。
- 查看代理的请求与响应是否遵循了预期的规则。
如何调试代理中间件?
可以在控制台中使用 debug
模块输出调试信息:
-- -------------------- ---- ------- ----- ----- - -------------------------------- ----- - --------------------- - - --------------------------------------- --------------- ----------------------- ------- ------------------------- ----------- ---------- ---- ---- -- - ------------ -------- -- ---- ----------- --------- -- ----------- ---------- ---- ---- -- - ------------ --------- -- ---- -------------------- ------------------------ -- ----
在控制台中使用以下命令启用调试信息:
DEBUG=myapp:proxy node app.js
如何取消代理中间件?
使用 app.disable('etag')
可以取消应用对 ETag 的支持。同样地,你可以使用 app.disable('proxy')
取消应用对某个代理中间件的支持。
参考文献
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600566c281e8991b448e31ed