@2o3t/koa2-proxy-middleware 中文文档教程
@2o3t/koa2-proxy-middleware
Node.js 代理变得简单。 轻松为 koa2 配置代理中间件。
由 http-proxy-middleware
提供支持。
TL;DR
代理 /api
请求到 http://www.2o3t.cn
const Koa = require('koa');
const app = new Koa();
const proxy = require('@2o3t/koa2-proxy-middleware');
// app.use(proxy({ target: 'http://www.2o3t.cn', changeOrigin: true }));
const Router = require('koa-router');
const router = new Router();
router.use(
'/api',
proxy({ target: 'http://www.2o3t.cn', changeOrigin: true })
);
app.use(router.routes())
.use(router.allowedMethods());
app.listen(3000);
// http://localhost:3000/api/foo/bar -> http://www.2o3t.cn/api/foo/bar
All http-proxy
options 可以一起使用带有一些额外的 http-proxy-middleware
选项。
:bulb: 提示 为 基于名称的虚拟托管站点。
Install
$ npm install --save-dev @2o3t/koa2-proxy-middleware
// or
yarn add @2o3t/koa2-proxy-middleware
Core concept
代理中间件配置。
proxy([context,] config)
const proxy = require('@2o3t/koa2-proxy-middleware');
const apiProxy = proxy('/api', { target: 'http://www.2o3t.cn' });
// \____/ \_____________________________/
// | |
// context options
// 'apiProxy' is now ready to be used as middleware in a server.
- context: Determine which requests should be proxied to the target host. (more on context matching)
- options.target: target host to proxy to. (protocol + host)
(http-proxy-middleware
配置选项的完整列表)
proxy(uri [, config])
// shorthand syntax for the example above:
const apiProxy = proxy('http://www.2o3t.cn/api');
关于速记配置的更多信息.
Example
koa2
服务器示例。
const Koa = require('koa');
const app = new Koa();
const proxy = require('@2o3t/koa2-proxy-middleware');
// proxy middleware options
const options = {
target: 'http://www.2o3t.cn', // target host
changeOrigin: true, // needed for virtual hosted sites
ws: true, // proxy websockets
pathRewrite: {
'^/api/old-path': '/api/new-path', // rewrite path
'^/api/remove/path': '/path' // remove base path
},
router: {
// when request.headers.host == 'dev.localhost:3000',
// override target 'http://www.2o3t.cn' to 'http://localhost:8000'
'dev.localhost:3000': 'http://localhost:8000'
}
};
// create the proxy (without context)
const exampleProxy = proxy(options);
app.use(exampleProxy)
app.use(ctx => {
console.log(ctx.status);
});
app.listen(3003);
Context matching
提供一种替代方式来决定应该代理哪些请求; 如果您无法使用服务器的path
parameter 来安装代理或当您需要更大的灵活性时。
RFC 3986 path
用于上下文匹配。
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
路径匹配
proxy({...})
- 匹配任何路径,所有请求都将被代理。proxy('/', {...})
- 匹配任何路径,所有请求都将被代理。proxy('/api', {...})
- 匹配以/api
开头的路径多路径匹配
proxy([ '/api', '/ajax', '/someotherpath'], {...})
通配符路径匹配
对于细粒度控制,您可以使用通配符匹配。 全局模式匹配由 micromatch 完成。 访问 micromatch 或 glob 获取更多通配示例。
proxy('**', {...})
匹配任何路径,所有请求都将被代理。proxy('**/*.html', {...})
匹配任何以.html
结尾的路径proxy('/*.html' , {...})
匹配直接在绝对路径下的路径proxy('/api/**/*.html', {...})
匹配以 < 结尾的请求/api
路径下的code>.htmlproxy(['/api/**', '/ajax/**'], {...})
组合多个模式proxy(['/api/**', '!**/bad.json'], {...})
exclusionNote:在多路径匹配中,不能同时使用字符串路径和通配符路径。
自定义匹配
为了完全控制,您可以提供自定义函数来确定哪些请求应该被代理或不被代理。
/**
* @return {Boolean}
*/
const filter = function(pathname, req) {
return pathname.match('^/api') && req.method === 'GET';
};
const apiProxy = proxy(filter, { target: 'http://www.2o3t.cn' });
Options
http-proxy-middleware
configuration options
new options
option.proxyBody
: [Boolean|Function] Collect the results returned by the agent and assign them toctx.body
. Default: false.
option.proxyBody: true,
// or
option.proxyBody: function(json, proxyRes, req, res, ctx) {
ctx.body = json;
}
License
麻省理工学院许可证 (MIT)
Copyright (c) 2018-2019 Zyao89
@2o3t/koa2-proxy-middleware
Node.js proxying made simple. Configure proxy middleware with ease for koa2.
Powered by http-proxy-middleware
.
TL;DR
Proxy /api
requests to http://www.2o3t.cn
const Koa = require('koa');
const app = new Koa();
const proxy = require('@2o3t/koa2-proxy-middleware');
// app.use(proxy({ target: 'http://www.2o3t.cn', changeOrigin: true }));
const Router = require('koa-router');
const router = new Router();
router.use(
'/api',
proxy({ target: 'http://www.2o3t.cn', changeOrigin: true })
);
app.use(router.routes())
.use(router.allowedMethods());
app.listen(3000);
// http://localhost:3000/api/foo/bar -> http://www.2o3t.cn/api/foo/bar
All http-proxy
options can be used, along with some extra http-proxy-middleware
options.
:bulb: Tip: Set the option changeOrigin
to true
for name-based virtual hosted sites.
Install
$ npm install --save-dev @2o3t/koa2-proxy-middleware
// or
yarn add @2o3t/koa2-proxy-middleware
Core concept
Proxy middleware configuration.
proxy([context,] config)
const proxy = require('@2o3t/koa2-proxy-middleware');
const apiProxy = proxy('/api', { target: 'http://www.2o3t.cn' });
// \____/ \_____________________________/
// | |
// context options
// 'apiProxy' is now ready to be used as middleware in a server.
- context: Determine which requests should be proxied to the target host. (more on context matching)
- options.target: target host to proxy to. (protocol + host)
(full list of http-proxy-middleware
configuration options)
proxy(uri [, config])
// shorthand syntax for the example above:
const apiProxy = proxy('http://www.2o3t.cn/api');
More about the shorthand configuration.
Example
An example with koa2
server.
const Koa = require('koa');
const app = new Koa();
const proxy = require('@2o3t/koa2-proxy-middleware');
// proxy middleware options
const options = {
target: 'http://www.2o3t.cn', // target host
changeOrigin: true, // needed for virtual hosted sites
ws: true, // proxy websockets
pathRewrite: {
'^/api/old-path': '/api/new-path', // rewrite path
'^/api/remove/path': '/path' // remove base path
},
router: {
// when request.headers.host == 'dev.localhost:3000',
// override target 'http://www.2o3t.cn' to 'http://localhost:8000'
'dev.localhost:3000': 'http://localhost:8000'
}
};
// create the proxy (without context)
const exampleProxy = proxy(options);
app.use(exampleProxy)
app.use(ctx => {
console.log(ctx.status);
});
app.listen(3003);
Context matching
Providing an alternative way to decide which requests should be proxied; In case you are not able to use the server's path
parameter to mount the proxy or when you need more flexibility.
RFC 3986 path
is used for context matching.
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
path matching
proxy({...})
- matches any path, all requests will be proxied.proxy('/', {...})
- matches any path, all requests will be proxied.proxy('/api', {...})
- matches paths starting with/api
multiple path matching
proxy(['/api', '/ajax', '/someotherpath'], {...})
wildcard path matching
For fine-grained control you can use wildcard matching. Glob pattern matching is done by micromatch. Visit micromatch or glob for more globbing examples.
proxy('**', {...})
matches any path, all requests will be proxied.proxy('**/*.html', {...})
matches any path which ends with.html
proxy('/*.html', {...})
matches paths directly under path-absoluteproxy('/api/**/*.html', {...})
matches requests ending with.html
in the path of/api
proxy(['/api/**', '/ajax/**'], {...})
combine multiple patternsproxy(['/api/**', '!**/bad.json'], {...})
exclusionNote: In multiple path matching, you cannot use string paths and wildcard paths together.
custom matching
For full control you can provide a custom function to determine which requests should be proxied or not.
/**
* @return {Boolean}
*/
const filter = function(pathname, req) {
return pathname.match('^/api') && req.method === 'GET';
};
const apiProxy = proxy(filter, { target: 'http://www.2o3t.cn' });
Options
http-proxy-middleware
configuration options
new options
option.proxyBody
: [Boolean|Function] Collect the results returned by the agent and assign them toctx.body
. Default: false.
option.proxyBody: true,
// or
option.proxyBody: function(json, proxyRes, req, res, ctx) {
ctx.body = json;
}
License
The MIT License (MIT)
Copyright (c) 2018-2019 Zyao89