Node.JS http 获取请求 returns 未定义

Node.JS http get request returns undefined

这本来应该很简单,但我没有取回数据而是未定义。

我在代理服务器后面,我不擅长从代理服务器后面发出请求。我发现只有一个教程解释了在不使用外部模块的情况下使用代理服务器时的 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为端口

此代码的输出未定义。

我什至不知道该方法是否正确,我也无法理解 out.I 阅读节点 http 文档并根据我的理解编写了选项对象,如果我知道请纠正我我错了。

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

重要

如果你想使用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 方法连接,并在套接字上写入一个简单的 get 请求, 并将其发送到 google,因为它是指定的路径。

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

const request = require('request');

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