【发布时间】:2020-03-17 13:07:18
【问题描述】:
我有一个 http 代理来代理任何网站并在将 HTML 提供回客户端之前注入一些自定义 JS 文件。每当我尝试访问代理网站时,它都会挂起或浏览器似乎无法确定加载。但是当我检查 HTML 源代码时,我成功地注入了我的自定义 JavaScript 文件。代码如下:
const cheerio = require('cheerio');
const http = require('http');
const httpProxy = require('http-proxy');
const { ungzip } = require('node-gzip');
_initProxy(host: string) {
let proxy = httpProxy.createProxyServer({});
let option = {
target: host,
selfHandleResponse: true
};
proxy.on('proxyRes', function (proxyRes, req, res) {
let body = [];
proxyRes.on('data', function (chunk) {
body.push(chunk);
});
proxyRes.on('end', async function () {
let buffer = Buffer.concat(body);
if (proxyRes.headers['content-encoding'] === 'gzip') {
try {
let $ = null;
const decompressed = await ungzip(buffer);
const scriptTag = '<script src="my-customjs.js"></script>';
$ = await cheerio.load(decompressed.toString());
await $('body').append(scriptTag);
res.end($.html());
} catch (e) {
console.log(e);
}
}
});
});
let server = http.createServer(function (req, res) {
proxy.web(req, res, option, function (e) {
console.log(e);
});
});
console.log("listening on port 5051");
server.listen(5051);
}
如果我做错了什么,有人可以告诉我,看起来 node-http-proxy 正在死去很多并且不能太依赖它,因为代理有时可以工作并在下次运行时死掉,具体取决于我运行了多少次服务器。
【问题讨论】:
-
奇怪你有问题,我觉得很好。虽然你不处理响应未压缩时的情况。
-
我愿意,只是想简化这篇文章的代码。
-
不是你的问题的真正答案,但你知道香草 nginx 可以通过几行配置来做到这一点,并且可能比节点代理更有效,因为你不需要解析html? gist.github.com/Tofandel/1ce9635335c6969b5bc0289140b925cd
-
我可能只是为您的问题添加了一个灯泡。您的脚本是否也被代理了?检查您是否可以访问它。如果不是,可能只是服务器也在尝试代理 js 文件并且不知道如何解析它们,它们将有一个空的正文并挂断浏览器
-
@NizarB。我的意思是 Cheerio 正在解析你所有的 html,这对于代理来说是相当内存和 cpu 密集型的,当你添加一个不需要这样做的脚本时,你可以找到字符串 "
标签: javascript node.js reverse-proxy http-proxy node-http-proxy