当前位置: 首页 > 知识库问答 >
问题:

如何在node.js中创建简单的http代理?

毋玺
2023-03-14

我正试图创建一个代理服务器,将httpget请求从客户端传递到第三方网站(比如谷歌)。我的代理只需要将传入请求镜像到目标站点上相应的路径,因此如果我的客户端请求的url为:

127.0.0.1/images/srpr/logo11w.png

应提供以下资源:

http://www.google.com/images/srpr/logo11w.png

以下是我想出来的:

http.createServer(onRequest).listen(80);

function onRequest (client_req, client_res) {
    client_req.addListener("end", function() {
        var options = {
            hostname: 'www.google.com',
            port: 80,
            path: client_req.url,
            method: client_req.method
            headers: client_req.headers
        };
        var req=http.request(options, function(res) {
            var body;
            res.on('data', function (chunk) {
                body += chunk;
            });
            res.on('end', function () {
                 client_res.writeHead(res.statusCode, res.headers);
                 client_res.end(body);
            });
        });
        req.end();
    });
}

它可以很好地处理html页面,但是对于其他类型的文件,它只是返回一个空白页面或目标站点的一些错误消息(这在不同的站点中有所不同)。

共有3个答案

萧宏远
2023-03-14

下面是一个代理服务器,它使用处理重定向的请求。通过点击你的代理URL来使用它http://domain.com:3000/?url=[你的网址]

var http = require('http');
var url = require('url');
var request = require('request');

http.createServer(onRequest).listen(3000);

function onRequest(req, res) {

    var queryData = url.parse(req.url, true).query;
    if (queryData.url) {
        request({
            url: queryData.url
        }).on('error', function(e) {
            res.end(e);
        }).pipe(res);
    }
    else {
        res.end("no url found");
    }
}
燕禄
2023-03-14

下面是使用nodejitsu的node-超文本传输协议-代理的实现。

var http = require('http');
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});

http.createServer(function(req, res) {
    proxy.web(req, res, { target: 'http://www.google.com' });
}).listen(3000);
庾鸿飞
2023-03-14

我认为处理从第三方服务器收到的响应不是一个好主意。这只会增加代理服务器的内存占用。此外,这也是代码不起作用的原因。

相反,尝试将响应传递给客户端。考虑下面的片段:

var http = require('http');

http.createServer(onRequest).listen(3000);

function onRequest(client_req, client_res) {
  console.log('serve: ' + client_req.url);

  var options = {
    hostname: 'www.google.com',
    port: 80,
    path: client_req.url,
    method: client_req.method,
    headers: client_req.headers
  };

  var proxy = http.request(options, function (res) {
    client_res.writeHead(res.statusCode, res.headers)
    res.pipe(client_res, {
      end: true
    });
  });

  client_req.pipe(proxy, {
    end: true
  });
}
 类似资料:
  • 问题内容: 我正在尝试创建一个代理服务器,以将请求从客户端传递到第三方网站(例如google)。我的代理只需将传入请求镜像到目标站点上的相应路径,因此,如果我的客户请求的url为: 应提供以下资源: 这是我想出的: 它适用于html页面,但对于其他类型的文件,它仅返回空白页面或来自目标站点的错误消息(在不同站点中有所不同)。 问题答案: 我认为处理从第三方服务器收到的响应不是一个好主意。这只会增加

  • 问题内容: 我目前正在学习Java,并且想知道如何以OO方式控制状态。我实现了一个Pong应用程序。如果我想要多个状态,例如游戏性和菜单状态,并且这些状态中的每个状态都必须执行启动,停止和运行,我将如何实现此目标以及如何在这些状态之间进行切换。 我知道我可以简单地添加一个大的switch语句,但是实现这一点的最佳方法是什么? 我希望能够在游戏状态下切换到菜单状态,反之亦然。 问题答案: 您可以使用

  • 问题内容: 有什么方法可以创建线程以一次运行多个方法吗? 这样,如果任何方法在所有其他线程之间失败,则应终止。 问题答案: 每个node.js进程在设计上都是单线程的。因此,要获得多个线程,您必须具有多个进程(正如其他一些发帖人所指出的那样,您还可以链接到一些库,这些库使您能够使用Node中的线程,但是没有这些库就没有这种能力。请参阅Shawn Vincent的回答,参考https://githu

  • 问题内容: 我有很多网址,并且想实现自动补全功能。我不喜欢朴素方法的复杂性,因为它与设置大小成线性关系: 现在我知道在哈希集中,函数“ contains()”在“ O(1)”中有效,但是没有“ containsPrefix()”。是否有一种简单的方法,而无需使用像Lucene这样的大库或自己编写代码?我这样做没有问题,但对于这样一个简单的问题似乎有点过头了,所以我想知道是否存在现有的简单解决方案:

  • 问题内容: 我无法弄清楚如何使用node.js firestore api创建新的Collection。有什么建议? 问题答案: 在向文档添加/写入文档时会自动创建它们。无需(也不需要API)显式创建集合。 从文档中: 集合和文档在Cloud Firestore中隐式创建。只需将数据分配给集合中的文档即可。如果集合或文档不存在,则Cloud Firestore会创建它。

  • 问题内容: 他们如何在Java中创建代理。他们是根据需要创建代理,还是创建代理并将其永久保存。 问题答案: 您可以通过两种基本方式创建代理: 通过接口使用JDK机制。看一看。 在具体的类上使用一些字节码生成/操作库。看看cglib和javassist Apache有一个很好的实用程序:commons- proxy 。它包装了许多用于创建代理的机制和框架。 这全部与动态代理有关,即在运行时创建的代理