当前位置:   article > 正文

Node的后台代理之http-proxy-middleware模块_createproxymiddleware onproxyres

createproxymiddleware onproxyres

转载自:https://blog.csdn.net/xmloveth/article/details/56847456

单线程node.js代理中间件,用于连接,快速和浏览器同步

Node.js代理简单。 轻松配置代理中间件连接,快速,浏览器同步等。

由流行的Nodejitsu http代理提供。

TL;DR

代理/ api请求到http://www.example.org

  1. var express = require('express');
  2. var proxy = require('http-proxy-middleware');
  3. var app = express();
  4. app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
  5. app.listen(3000);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以使用所有http-proxy选项,以及一些额外的http-proxy-middleware选项。

提示:将基于名称的虚拟托管网站的选项changeOrigin设置为true

内容列表

  • 安装
  • 核心概念
  • 举个栗子
  • 上下文匹配
  • 选项 
    • http-proxy-middleware选项
    • http-proxy事件
    • http-proxy选项
  • 速记 
    • app.use(path, proxy)
  • WebSocket 
    • 外部Websocket升级
  • 工作示例
  • Recipes
  • 兼容的服务器
  • 测试
  • 更新日志
  • License

Install

$ npm install --save-dev http-proxy-middleware
  • 1

proxy([context,] config)

  1. var proxy = require('http-proxy-middleware');
  2. var apiProxy = proxy('/api', {target: 'http://www.example.org'});
  3. // \____/ \_____________________________/
  4. // | |
  5. // context options
  6. // 'apiProxy' is now ready to be used as middleware in a server.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • context:确定应将哪些请求代理到目标主机。 (更多关于上下文匹配)
  • options.target:目标主机到代理。 (协议+主机)

http-proxy-middleware配置选项的完整列表)

proxy(uri [, config])

  1. // shorthand syntax for the example above:
  2. var apiProxy = proxy('http://www.example.org/api');
  • 1
  • 2

更多关于速记配置。


举个栗子

使用express服务器的示例。

  1. // include dependencies
  2. var express = require('express');
  3. var proxy = require('http-proxy-middleware');
  4. // proxy middleware options
  5. var options = {
  6. target: 'http://www.example.org', // target host
  7. changeOrigin: true, // needed for virtual hosted sites
  8. ws: true, // proxy websockets
  9. pathRewrite: {
  10. '^/api/old-path' : '/api/new-path', // rewrite path
  11. '^/api/remove/path' : '/path' // remove base path
  12. },
  13. router: {
  14. // when request.headers.host == 'dev.localhost:3000',
  15. // override target 'http://www.example.org' to 'http://localhost:8000'
  16. 'dev.localhost:3000' : 'http://localhost:8000'
  17. }
  18. };
  19. // create the proxy (without context)
  20. var exampleProxy = proxy(options);
  21. // mount `exampleProxy` in web server
  22. var app = express();
  23. app.use('/api', exampleProxy);
  24. app.listen(3000);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Context matching

提供一种替代方式来决定哪些请求应该被代理;如果您无法使用服务器的路径参数来装载代理,或者需要更多的灵活性。

RFC 3986路径用于上下文匹配。

  1. foo://example.com:8042/over/there?name=ferret#nose
  2. \_/ \______________/\_________/ \_________/ \__/
  3. | | | | |
  4. scheme authority path query fragment
  • 1
  • 2
  • 3
  • 4
  • 路径匹配 
    • proxy({...}) - 匹配任意路径,所有的请求都会被代理。
    • proxy('/', {...})-匹配任意路径,所有的请求都会被代理。
    • proxy('/api', {...})-匹配所有以/api开始的路径。
  • 多重路径匹配 
    • proxy(['/api', '/ajax', '/someotherpath'], {...})
  • 通配符路径匹配 
    对于细粒度控制,您可以使用通配符匹配。通过micromatch进行全局模式匹配。访问micromatchglob更多globbing示例。

    • proxy('**', {...}) 匹配任意路径,所有的请求都会被代理。
    • proxy('**/*.html', {...}) 匹配所有以.html结尾的任意路径。
    • proxy('/*.html', {...}) 直接匹配绝对路径下的路径。
    • proxy('/api/**/*.html', {...})匹配在/api路径下以.html结尾的请求。
    • proxy(['/api/**', '/ajax/**'], {...})组合多重路由模式。
    • proxy(['/api/**', '!**/bad.json'], {...})排除匹配。
  • 自定义匹配 
    为了完全控制,您可以提供一个自定义函数来确定哪些请求应该被代理。
  1. var filter = function (pathname, req) {
  2. return (pathname.match('^/api') && req.method === 'GET');
  3. };
  4. var apiProxy = proxy(filter, {target: 'http://www.example.org'})
  • 1
  • 2
  • 3
  • 4
  • 5

选项

http-proxy-middleware选项

  • option.pathRewrite:对象/函数,重写目标的url路径。对象键将被用作RegExp来匹配路径。

    1. // rewrite path
    2. pathRewrite: {'^/old/api' : '/new/api'}
    3. // remove path
    4. pathRewrite: {'^/remove/api' : ''}
    5. // add base path
    6. pathRewrite: {'^/' : '/basepath/'}
    7. // custom rewriting
    8. pathRewrite: function (path, req) { return path.replace('/api', '/base/api') }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • option.router:对象/函数,重新定位特定请求的option.target

    1. // Use `host` and/or `path` to match requests. First match will be used.
    2. // The order of the configuration matters.
    3. router: {
    4. 'integration.localhost:3000' : 'http://localhost:8001', // host only
    5. 'staging.localhost:3000' : 'http://localhost:8002', // host only
    6. 'localhost:3000/api' : 'http://localhost:8003', // host + path
    7. '/rest' : 'http://localhost:8004' // path only
    8. }
    9. // Custom router function
    10. router: function(req) {
    11. return 'http://localhost:8004';
    12. }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • option.logLevel:字符串, [‘debug’, ‘info’, ‘warn’, ‘error’, ‘silent’]. 默认:'info'
  • option.logProvider:函数,修改或者替换日志服务。默认:'console'

    1. // simple replace
    2. function logProvider(provider) {
    3. // replace the default console log provider.
    4. return require('winston');
    5. }
    • 1
    • 2
    • 3
    • 4
    • 5
    1. // verbose replacement
    2. function logProvider(provider) {
    3. var logger = new (require('winston').Logger)();
    4. var myCustomProvider = {
    5. log: logger.log,
    6. debug: logger.debug,
    7. info: logger.info,
    8. warn: logger.warn,
    9. error: logger.error
    10. }
    11. return myCustomProvider;
    12. }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • (已弃用)option.proxyHost:用option.changeOrigin = true代替。
  • (已弃用)option.proxyTable:用option.router代替。

    http-proxy 事件

    订阅http-proxy事件

  • option.onError:函数,订阅http-proxyerror事件以进行自定义错误处理。

    1. function onError(err, req, res) {
    2. res.writeHead(500, {
    3. 'Content-Type': 'text/plain'
    4. });
    5. res.end('Something went wrong. And we are reporting a custom error message.');
    6. }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • option.onProxyRes:函数,订阅http-proxyproxyRes事件。

    1. function onProxyRes(proxyRes, req, res) {
    2. proxyRes.headers['x-added'] = 'foobar'; // add new header to response
    3. delete proxyRes.headers['x-removed']; // remove header from response
    4. }
    • 1
    • 2
    • 3
    • 4
  • option.onProxyReq:函数,订阅http-proxyproxyReq事件。

    1. function onProxyReq(proxyReq, req, res) {
    2. // add custom header to request
    3. proxyReq.setHeader('x-added', 'foobar');
    4. // or log the req
    5. }
    • 1
    • 2
    • 3
    • 4
    • 5
  • option.onProxyReqWs:函数,订阅http-proxyproxyReqWs事件。

    1. function onProxyReqWs(proxyReq, req, socket, options, head) {
    2. // add custom header
    3. proxyReq.setHeader('X-Special-Proxy-Header', 'foobar');
    4. }
    • 1
    • 2
    • 3
    • 4
  • option.onOpen:函数,订阅http-proxy的 open事件。

    1. function onOpen(proxySocket) {
    2. // listen for messages coming FROM the target here
    3. proxySocket.on('data', hybiParseAndLogMessage);
    4. }
    • 1
    • 2
    • 3
    • 4
  • option.onClose:函数,订阅http-proxy 的close事件。

    1. function onClose(res, socket, head) {
    2. // view disconnected websocket connections
    3. console.log('Client disconnected');
    4. }
    • 1
    • 2
    • 3
    • 4

http-proxy选项

底层http-proxy库提供以下选项。

  • option.target:url字符串将与url模块解析
  • option.forward:url字符串将与url模块解析
  • option.target:传递给http(s)请求的对象(参阅Node https代理和http代理对象)
  • option.ssl:传递给https.createServer()的对象
  • option.ws:true / false,如果你想要代理websockets
  • option.xfwd:true / false,添加x-forward请求头
  • option.secure:true / false,如果你想要验证SSL证书
  • option.toProxy:true / false,将绝对URL作为path(对代理使用代理时很有用)
  • option.prependPath:true / false,默认:true-指定是否要将目标的路径预置到代理路径
  • option.ignorePath:true / false,默认:false-指定是否要忽略传入请求的代理路径(注意:如果需要,您将必须附加/手动)。
  • option.localAddress:用于传出连接的本地接口字符串
  • option.changeOrigin:true / false,默认值:false - 将主机头的源更改为目标URL
  • option.auth:基本认证,即“用户:密码”来计算授权头。
  • option.hostRewrite:重写(301/302/307/308)重定向的位置主机名。
  • option.autoRewrite:根据请求的主机/端口重写(301/302/307/308)重定向的位置主机/端口。默认值:false。
  • option.protocolRewrite:重写位置协议(301/302/307/308)重定向到’http’或’https’。默认值:null。
  • option.cookieDomainRewrite:重写set-cookie标头的域。可能的值: 
    false(默认):禁止重写cookie 
    - 字符串:新域名,比如说cookieDomainRewrite:"new.domain"。使用cookieDomainRewrite:""删除域名。 
    - 对象:域名到新域名的映射,用”*”匹配所有域名。 
    举个栗子:保持一个域名不变,重写一个域名并且删除其他的: 

    cookieDomainRewrite: { 
    "unchanged.domain": "unchanged.domain", 
    "old.domain": "new.domain", 
    "*": "" 

  • option.headers:对象,添加请求头。(比如:{host:'www.example.org'}
  • option.proxyTimeout:超时时间(毫秒)当代理接收不到目标服务器的返回

速记

当不需要详细配置时,请使用简写语法。当使用速记时,上下文和option.target将被自动配置。如果需要,仍然可以使用选项。

  1. proxy('http://www.example.org:8000/api');
  2. // proxy('/api', {target: 'http://www.example.org:8000'});
  3. proxy('http://www.example.org:8000/api/books/*/**.json');
  4. // proxy('/api/books/*/**.json', {target: 'http://www.example.org:8000'});
  5. proxy('http://www.example.org:8000/api', {changeOrigin:true});
  6. // proxy('/api', {target: 'http://www.example.org:8000', changeOrigin: true});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

app.use(path, proxy)

如果要使用服务器的app.usepath参数匹配请求;创建并装载不带http-proxy-middleware`上下文参数的代理:

app.use('/api', proxy({target:'http://www.example.org', changeOrigin:true}));
  • 1

app.use文档


Websocket

  1. // verbose api
  2. proxy('/', {target:'http://echo.websocket.org', ws:true});
  3. // shorthand
  4. proxy('http://echo.websocket.org', {ws:true});
  5. // shorter shorthand
  6. proxy('ws://echo.websocket.org');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

外部WebSocket升级

在以前的WebSocket示例中,http代理中间件依赖于初始http请求以便侦听http升级事件。如果需要在没有初始http请求的情况下代理WebSockets,则可以手动预订服务器的http升级事件。

  1. var wsProxy = proxy('ws://echo.websocket.org', {changeOrigin:true});
  2. var app = express();
  3. app.use(wsProxy);
  4. var server = app.listen(3000);
  5. server.on('upgrade', wsProxy.upgrade); // <-- subscribe to http 'upgrade'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/662474
推荐阅读
相关标签
  

闽ICP备14008679号