node 中间层怎样做的请求合并转发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node 中间层怎样做的请求合并转发相关的知识,希望对你有一定的参考价值。

参考技术A 1) 什么是中间层

2)中间层可以做的事情

3)node转发API(node中间层)的优势

4)如何做请求合并转发

5)不使用用第三方模块手动实现一个nodejs代理服务器,实现请求合并转发

1.实现思路

2.实现步骤

这一步主要数据在客户端到服务器端进行传输时在nodejs中需要用到buffer来处理一下。处理过程就是将所有接收的数据片段chunk塞到一个数组中,然后将其合并到一起还原出源数据。合并方法需要用到Buffer.concat,这里不能使用加号,加号会隐式的将buffer转化为字符串,这种转化不安全。

使用 node-http-proxy 转发每个请求

【中文标题】使用 node-http-proxy 转发每个请求【英文标题】:Forward every request with node-http-proxy 【发布时间】:2013-04-29 16:13:41 【问题描述】:

我正在尝试设置一个仅转发请求的 node-http-proxy。 最后,这个代理应该在我通过浏览器访问的每个网站中注入 javascript..

目前,大多数页面都已正确转发和显示,但有些页面(例如 posterkoenig.ch 或 verkehrsclub.ch)返回空白页面或页面上有错误。如果没有代理,这两个站点都可以正常工作。我需要改变什么,或者我错过了什么没有正确转发?

我对 nodejs 很陌生,甚至不完全确定我的方法是否可行。

这是我目前得到的:

var httpProxy = require('http-proxy');
var url = require('url');

httpProxy.createServer(function(req, res, proxy) 

  var urlObj = url.parse(req.url);

  proxy.proxyRequest(req, res, 
    host: urlObj.host,
    port: 80,
    changeOrigin: true,
    enable :  xforward: true 
  );
).listen(9000, function () 
  console.log("Waiting for requests...");
);

更新

按照@robertklep 的建议,我删除了changeOrigin 并重新定义了req.headers.hostreq.headers.url

posterkoenig.ch

现在抛出:

An error has occurred: 
"code":"ENOTFOUND","errno":"ENOTFOUND","syscall":"getaddrinfo"

verkehrsclub.ch

首页现在可以正常工作,但子页面仍然会在页面上抛出错误。

var httpProxy = require('http-proxy');
var url = require('url');

httpProxy.createServer(function(req, res, proxy) 

  var urlObj = url.parse(req.url);

  req.headers['host'] = urlObj.host;
  req.headers['url'] = urlObj.href;

  proxy.proxyRequest(req, res, 
    host: urlObj.host,
    port: 80,
    enable :  xforward: true 
  );
).listen(9000, function () 
  console.log("Waiting for requests...");
);

【问题讨论】:

您能否为 HTTPS 网站执行此操作? 基本上应该是可以的..我没试过,但是documentation of node-http-proxy说它支持https。但是您的节点应用程序也必须运行 https 服务器,因此您需要有效的 https 证书和密钥才能使其工作。然后,您应该能够将上述脚本的slight variation 与 https 服务器一起使用。希望有帮助! 您如何配置浏览器以使用此代理?刚刚输入 localhost:9000 作为 Web 代理服务器地址? 【参考方案1】:

您的第一个问题与changeOrigin 有关:它将向远程服务器发送一个包含端口号的Host 标头,而您提到的两个站点都无法处理。

相反,试试这个:

req.headers.host = urlObj.host;
req.url          = urlObj.path;
proxy.proxyRequest(req, res, 
  host: urlObj.host,
  port: 80,
  enable :  xforward: true 
);

至于您的其他问题,我认为这可能与不以 UTF-8 形式提供内容的网站有关(如果您不传递编码,.toString() 将使用该编码)。它总是发生,还是只发生在某些网站上?

FWIW,harmon 是node-http-proxy 的中间件,它提供了一种重写响应的好方法。对于您的情况,这可能有点过头了,但它也可能解决您的问题。

编辑:这是一个似乎对posterkoenig.chwww.verkehrsclub.ch(主页和子页面)都适用的最小示例:

var httpProxy = require('http-proxy');
var url       = require('url');

httpProxy.createServer(function(req, res, proxy) 
  var urlObj = url.parse(req.url);

  req.headers.host  = urlObj.host;
  req.url           = urlObj.path;

  proxy.proxyRequest(req, res, 
    host    : urlObj.host,
    port    : 80,
    enable  :  xforward: true 
  );
).listen(9000, function () 
  console.log("Waiting for requests...");
);

【讨论】:

感谢您的宝贵时间!我试过这个,但是当我删除 changeOrigin 标志时,posterkoenig.ch 返回 An error has occurred: "code":"ENOTFOUND","errno":"ENOTFOUND","syscall ":"getaddrinfo"。然后我还重新定义了 headers.url.. 这样,verkehrsclub.ch 的首页正确显示,但每个子页面仍然损坏.. 我在问题中更新了我的代码 您收到的postkoenig.ch 错误表明DNS 错误,这很奇怪(在这种情况下urlObj.host 的值是多少?)。另外,我编辑了我的答案,因为我发现了另一个可能导致您的第二个问题的问题。 谢谢,req.url = urlObj.path; 完成了这项工作! 我尝试了最小的例子,但它只关注来自 127.0.0.1 的请求。如何让它也监听来自外部来源的请求? @SzerémiAttila 我认为这与http-proxy 无关,我对其进行了测试(在我的 Mac 上运行代理,通过我的 Linux 服务器访问它)并且它按原样工作。也许您有阻止传入连接的防火墙?

以上是关于node 中间层怎样做的请求合并转发的主要内容,如果未能解决你的问题,请参考以下文章

GitLab合并请求报错

webpack4+node合并资源请求, 实现combo功能(二十三)

为 GitLab 编写脚本以自动合并合并请求

实用数据结构:怎样把两个单链表A B(本身都是有序表)合并为C并且C为有序表

node生成带logo的二维码的中间件

怎样一个表中的2个查询结果合并到一个表中的两列