【问题标题】:Node.JS http get request returns undefinedNode.JS http get 请求返回 undefined
【发布时间】:2017-09-08 22:22:46
【问题描述】:

这应该很简单,但我没有得到数据,而是得到了不确定。

我在代理服务器后面,我不擅长从代理服务器后面发出请求。我发现只有一个教程解释了在不使用外部模块的情况下使用代理服务器时的 http 请求,并且没有正确解释。

const http = require('http');
let options = {
    host: '10.7.0.1',
    port:8080,
    path:'www.google.co.uk'
}

http.get(options,(res) => {
    let str = '';
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
    str += chunk;
})

res.on('end', (str) => {
    console.log(str);
    })
})

10.7.0.1是代理服务器的地址,8080是端口。

这段代码的输出是未定义的。

我什至不知道该方法是否正确,我无法弄清楚。我阅读了节点 http 文档并尽我所知编写了选项对象,如果我错了,请纠正我。

一般来说,在代理服务器后面我如何发出请求。

【问题讨论】:

  • 请查看更新并让我知道它是否有效 :) @Daksh

标签: node.js httprequest http-proxy


【解决方案1】:

重要

如果你想使用http连接代理,请看这里,你需要使用connect方法

const options = {
    port: 8080,
    hostname: '10.7.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  const req = http.request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
console.log('got connected!');

socket.write('GET / HTTP/1.1\r\n' +
             'Host: www.google.com:80\r\n' +
             'Connection: close\r\n' +
             '\r\n');
socket.on('data', (chunk) => {
  console.log(chunk.toString());
});
socket.on('end', () => {
  proxy.close();
}

额外信息(不需要)

这是我在here 上找到的关于如何创建代理并在其背后发出请求的完整代码。它基本上是创建一个服务器并通过它发出请求。

const http = require('http');
const net = require('net');
const url = require('url');

// Create an HTTP tunneling proxy
const proxy = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
proxy.on('connect', (req, cltSocket, head) => {
  // connect to an origin server
  const srvUrl = url.parse(`http://${req.url}`);
  const srvSocket = net.connect(srvUrl.port, srvUrl.hostname, () => {
    cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    srvSocket.write(head);
    srvSocket.pipe(cltSocket);
    cltSocket.pipe(srvSocket);
  });
});

// now that proxy is running
proxy.listen(1337, '127.0.0.1', () => {

  // make a request to a tunneling proxy
  const options = {
    port: 1337,
    hostname: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  const req = http.request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
    console.log('got connected!');

    // make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    socket.on('end', () => {
      proxy.close();
    });
  });
});

它正在通过http.createServer()创建一个服务器,然后在它们完成后开始用proxy.listen()监听,它使用http的connect方法连接,并在socket上写入一个简单的get请求,并将其发送给google是指定的路径。

【讨论】:

  • 谢谢,但我在 google 上有很多教程解释了使用外部模块发出请求,但我想使用 Node 的标准模块来做同样的事情。
  • 要在带有 http 模块的代理后面发出请求,您需要使用该命令设置代理,这就是您要找的吗? @Daksh
  • @Daksh 请查看我的更新,我想我已经找到了解决方案。我很难理解你的问题,对不起。您需要使用 connect 方法,并指定路径。这是一个例子。 :)
  • 我觉得你搞错了,我不想创建代理服务器。让我详细说明一下 => 我在一所大学里,它使用代理服务器(就像大多数大学一样)与否,另外我想要一种在这种情况下发出 http 请求的通用方法。
  • 然后只看上面的代码,它几乎是不言自明的,如果你有任何问题,可以告诉我你在10.7.0.1 上有什么吗? @Daksh
【解决方案2】:

request 包允许以非常优雅的方式发出http 请求,并且为了指定代理,只需在选项对象请求中设置proxy 键的值作为参数。

const request = require('request');

request({url: 'http://example.com', proxy: 'https://host:port'}, (error, response, body) => {
  //Do whatever you want
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多