赞
踩
转载自:https://blog.csdn.net/xmloveth/article/details/56847456
单线程node.js代理中间件,用于连接,快速和浏览器同步
Node.js代理简单。 轻松配置代理中间件连接,快速,浏览器同步等。
由流行的Nodejitsu http代理提供。
代理/ api请求到http://www.example.org
- var express = require('express');
- var proxy = require('http-proxy-middleware');
-
- var app = express();
-
- app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
- app.listen(3000);
可以使用所有http-proxy
选项,以及一些额外的http-proxy-middleware
选项。
提示:将基于名称的虚拟托管网站的选项changeOrigin
设置为true
。
$ npm install --save-dev http-proxy-middleware
- var proxy = require('http-proxy-middleware');
-
- var apiProxy = proxy('/api', {target: 'http://www.example.org'});
- // \____/ \_____________________________/
- // | |
- // context options
-
- // 'apiProxy' is now ready to be used as middleware in a server.
(http-proxy-middleware
配置选项的完整列表)
- // shorthand syntax for the example above:
- var apiProxy = proxy('http://www.example.org/api');
更多关于速记配置。
使用express服务器的示例。
- // include dependencies
- var express = require('express');
- var proxy = require('http-proxy-middleware');
-
- // proxy middleware options
- var options = {
- target: 'http://www.example.org', // 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.example.org' to 'http://localhost:8000'
- 'dev.localhost:3000' : 'http://localhost:8000'
- }
- };
-
- // create the proxy (without context)
- var exampleProxy = proxy(options);
-
- // mount `exampleProxy` in web server
- var app = express();
- app.use('/api', exampleProxy);
- app.listen(3000);
提供一种替代方式来决定哪些请求应该被代理;如果您无法使用服务器的路径参数来装载代理,或者需要更多的灵活性。
RFC 3986路径用于上下文匹配。
- 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
更多globbing
示例。
proxy('**', {...})
匹配任意路径,所有的请求都会被代理。proxy('**/*.html', {...})
匹配所有以.html
结尾的任意路径。proxy('/*.html', {...})
直接匹配绝对路径下的路径。proxy('/api/**/*.html', {...})
匹配在/api
路径下以.html
结尾的请求。proxy(['/api/**', '/ajax/**'], {...})
组合多重路由模式。proxy(['/api/**', '!**/bad.json'], {...})
排除匹配。- var filter = function (pathname, req) {
- return (pathname.match('^/api') && req.method === 'GET');
- };
-
- var apiProxy = proxy(filter, {target: 'http://www.example.org'})
option.pathRewrite:对象/函数,重写目标的url路径。对象键将被用作RegExp来匹配路径。
- // rewrite path
- pathRewrite: {'^/old/api' : '/new/api'}
-
- // remove path
- pathRewrite: {'^/remove/api' : ''}
-
- // add base path
- pathRewrite: {'^/' : '/basepath/'}
-
- // custom rewriting
- pathRewrite: function (path, req) { return path.replace('/api', '/base/api') }
option.router:对象/函数,重新定位特定请求的option.target
。
- // Use `host` and/or `path` to match requests. First match will be used.
- // The order of the configuration matters.
- router: {
- 'integration.localhost:3000' : 'http://localhost:8001', // host only
- 'staging.localhost:3000' : 'http://localhost:8002', // host only
- 'localhost:3000/api' : 'http://localhost:8003', // host + path
- '/rest' : 'http://localhost:8004' // path only
- }
-
- // Custom router function
- router: function(req) {
- return 'http://localhost:8004';
- }
'info'
。option.logProvider:函数,修改或者替换日志服务。默认:'console'
。
- // simple replace
- function logProvider(provider) {
- // replace the default console log provider.
- return require('winston');
- }
- // verbose replacement
- function logProvider(provider) {
- var logger = new (require('winston').Logger)();
-
- var myCustomProvider = {
- log: logger.log,
- debug: logger.debug,
- info: logger.info,
- warn: logger.warn,
- error: logger.error
- }
- return myCustomProvider;
- }
option.changeOrigin = true
代替。(已弃用)option.proxyTable:用option.router
代替。
订阅http-proxy事件
option.onError:函数,订阅http-proxy
的error
事件以进行自定义错误处理。
- function onError(err, req, res) {
- res.writeHead(500, {
- 'Content-Type': 'text/plain'
- });
- res.end('Something went wrong. And we are reporting a custom error message.');
- }
option.onProxyRes:函数,订阅http-proxy
的proxyRes
事件。
- function onProxyRes(proxyRes, req, res) {
- proxyRes.headers['x-added'] = 'foobar'; // add new header to response
- delete proxyRes.headers['x-removed']; // remove header from response
- }
option.onProxyReq:函数,订阅http-proxy
的proxyReq
事件。
- function onProxyReq(proxyReq, req, res) {
- // add custom header to request
- proxyReq.setHeader('x-added', 'foobar');
- // or log the req
- }
option.onProxyReqWs:函数,订阅http-proxy
的proxyReqWs
事件。
- function onProxyReqWs(proxyReq, req, socket, options, head) {
- // add custom header
- proxyReq.setHeader('X-Special-Proxy-Header', 'foobar');
- }
option.onOpen:函数,订阅http-proxy
的 open
事件。
- function onOpen(proxySocket) {
- // listen for messages coming FROM the target here
- proxySocket.on('data', hybiParseAndLogMessage);
- }
option.onClose:函数,订阅http-proxy
的close
事件。
- function onClose(res, socket, head) {
- // view disconnected websocket connections
- console.log('Client disconnected');
- }
底层http-proxy库提供以下选项。
path
(对代理使用代理时很有用)false
(默认):禁止重写cookie
cookieDomainRewrite:"new.domain"
。使用cookieDomainRewrite:""
删除域名。
cookieDomainRewrite: {
"unchanged.domain": "unchanged.domain",
"old.domain": "new.domain",
"*": ""
}
{host:'www.example.org'}
)当不需要详细配置时,请使用简写语法。当使用速记时,上下文和option.target
将被自动配置。如果需要,仍然可以使用选项。
- proxy('http://www.example.org:8000/api');
- // proxy('/api', {target: 'http://www.example.org:8000'});
-
-
- proxy('http://www.example.org:8000/api/books/*/**.json');
- // proxy('/api/books/*/**.json', {target: 'http://www.example.org:8000'});
-
-
- proxy('http://www.example.org:8000/api', {changeOrigin:true});
- // proxy('/api', {target: 'http://www.example.org:8000', changeOrigin: true});
如果要使用服务器的app.usepath参数匹配请求;创建并装载不带
http-proxy-middleware`上下文参数的代理:
app.use('/api', proxy({target:'http://www.example.org', changeOrigin:true}));
app.use文档
- // verbose api
- proxy('/', {target:'http://echo.websocket.org', ws:true});
-
- // shorthand
- proxy('http://echo.websocket.org', {ws:true});
-
- // shorter shorthand
- proxy('ws://echo.websocket.org');
在以前的WebSocket
示例中,http
代理中间件依赖于初始http
请求以便侦听http
升级事件。如果需要在没有初始http
请求的情况下代理WebSockets
,则可以手动预订服务器的http
升级事件。
- var wsProxy = proxy('ws://echo.websocket.org', {changeOrigin:true});
-
- var app = express();
- app.use(wsProxy);
-
- var server = app.listen(3000);
- server.on('upgrade', wsProxy.upgrade); // <-- subscribe to http 'upgrade'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。