0

嘿伙计们,我第一次尝试使用 nodejs 进行多个 https 连接时有点卡住了。以下代码无法启动,并且我收到一条错误消息,内容为:

Hint: hit control+c anytime to enter REPL.
events.js:174
      throw er; // Unhandled 'error' event
      ^

Error: socket hang up
    at createHangUpError (_http_client.js:323:15)
    at TLSSocket.socketOnEnd (_http_client.js:426:23)
    at TLSSocket.emit (events.js:203:15)
    at TLSSocket.EventEmitter.emit (domain.js:448:20)
    at endReadableNT (_stream_readable.js:1143:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)
Emitted 'error' event at:
    at TLSSocket.socketOnEnd (_http_client.js:426:9)
    at TLSSocket.emit (events.js:203:15)
    [... lines matching original stack trace ...]
    at process._tickCallback (internal/process/next_tick.js:63:19)

(To exit, press ^C again or type .exit)

这是我的代码:

const https = require('https');

function RandomIp(length) {
   var result           = '';
   var characters       = '123456789';
   var charactersLength = characters.length;

   for ( var i = 0; i < length; i++ ) {
      result += characters.charAt(Math.floor(Math.random() * charactersLength));
   }

   return result;
}

var userAgent = 'iPhone / Safari 12.1.1 [Mobile]: Mozilla/5.0 (iPhone; CPU OS 10_15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/14E304 Safari/605.1.15';
var flag      = false;
var ip        = RandomIp(3) +"."+ RandomIp(3) +"."+ RandomIp(3) +"."+ RandomIp(3);

const options = {
  hostname: 'sh0rt.me',
  port: 443,
  path: '/r/XX6fYM',
  method: 'GET',
  headers: {
     'X-Forwarded-For': ip,
     'User-Agent': userAgent
  }
};

const req = https.request(options, (res) => {
  console.log('statusCode:', res.statusCode);
  console.log('headers:', res.headers);

  res.on('data', (d) => {
    process.stdout.write(d);
    console.log("first connection successfull!")
    console.log(flag);

    flag=!flag;
    console.log(flag);

    if (flag == true){
      console.log("Ready for second connection");

      const optionsd = {
        hostname: 'sh0rt.me',
        port: 443,
        path: '/r/XX6fYM',
        method: 'GET',
        headers: {
          'X-Forwarded-For': ip,
          'User-Agent': userAgent,
          'Cookies' : 'cookies lol'
        }
      };

      const reqd = https.request(optionsd, (resd) => {
        console.log('statusCode:', resd.statusCode);
        console.log('headers:', resd.headers);

        resd.on('data', (d) => {
          //process.stdout.write(d);
          console.log("1. Anfrage erfolgreich!")
          console.log(flag);
          console.log(options);
        })
      });

    };

    req.on('error', (e) => {
      console.error(e);
    });
  });
});

我知道这个问题很长,但如果有人能告诉我我做错了什么,我会很高兴。

谢谢各位^^

4

1 回答 1

0

该代码有很多问题可以解决,对于初学者来说,您没有在“reqd”对象(由您的第二个 https.request 返回)中添加“错误”事件的侦听器,这就是为什么不打印控制台中的错误。

您实际上不需要在此代码中添加 req.end() 调用,因为脚本结束时连接将完成(在这种情况下很好),而且不要使用包含的 https 模块来执行请求,是不需要事件绑定的更好的实现,例如:

  • isomorphic-fetch(您可以在浏览器中找到非常相似的 fetch 函数实现)
  • axios(非常好和完整)

其他事情,永远不要这样做:

if(flag == true)

因为如果期望一个真值或假值,那么标志已经是那个,就像:

if(flag)

另外,对于我所看到的(如果我错了,请纠正我)您正在生成随机 ips?,这可能行不通,因为 ips 不是随机的并且它们具有结构,不像使用四个 3 位数字,它会是一个有效的 IP 地址。

尝试首先使用您已经知道的 ips,因此可能会引发错误。

于 2020-03-06T18:03:28.893 回答