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

127.0.0.1/images/srpr/logo11w.png

应提供以下资源:

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

以下是我的 idea :

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页面,但对于其他类型的文件,它只返回一个空白页面或来自目标站点的一些错误消息(在不同的站点中有所不同).

推荐答案

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

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

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
  });
}

Node.js相关问答推荐

如何更改ejs中的镜像src,以防从OMDB API获取的某些镜像具有src=N/A

(0,core_1.default)不是使用@middy/core的lambda处理程序上的函数

"sh:/usr/local/bin/node:当它存在于文件目录中时未找到

如何在医学中按patientId查找一个并同时插入多个数据

使用 Google Drive API 按文件夹 ID 检索文件夹的内容

将 POST 的 json 变量格式化为 lambda

在生产环境中,Nest实例启动时抛出不完整的导入错误

Solidity 将数据位置从内存更改为存储

Angular Build 生产返回致命的 javascript 无效大小错误

使用 NPM 三个 mocha+typescript 进行测试

MongoDB Aggregate - 如何使用前一阶段的值作为下一阶段的字段名称?

简单的 Node js 程序但执行顺序似乎不同?

如何刷新 youtube-data-api v3 的访问令牌

Node.js 变量声明和范围

如何将使用 Gulp 的 node 部署到 heroku

使用restify时如何支持cors

为当前目录提供服务的简单文件服务器

Node.js 支持 =>(箭头函数)

安装 node 包时可以使用自定义目录名称而不是node_modules吗?

在 react-router v4 中使用 React IndexRoute