Закройте соединение сокета в request.js

У меня есть программа, которая использует модуль запроса для получения html.

Есть ли способ вручную закрыть соединение сокета после получения ответа, кроме прерывания, а также удалить всех слушателей из этого конкретного экземпляра запроса.

Основная проблема заключается в том, что по мере того, как программа продолжает делать запросы, количество файловых дескрипторов и слушателей продолжает расти, независимо от использования abort () после завершения выборки.

Наконец, программа завершается после достижения размера maxListeners, который уже установлен на 20000.

const request=require('request')
fetchUrl (params, tag, callBack) {
    this.url = params.url
    this.tag = tag
    let headers = { 'User-Agent': params.useragent }
    let options = { followRedirects: false, keepAlive: false, url: params.url, headers: headers, gzip: true, encoding: null }
    let proxy = 'None'
    let userAgent = params.useragent
    
    if (parseInt(ConfigHandler.getConfig().spfUseProxy) === 1) {
      if (parseInt(ConfigHandler.getConfig().spfUseHermesUserAgent) === 1) {
        userAgent = params.useragent + ' Hughes-PFB/' +
          params.agentid + '/' + params.tracetags
        headers['User-Agent'] = userAgent
        headers['Connection'] = 'Close'
      }
      
      proxy = 'http://' + ConfigHandler.getConfig().iosPrefetchProxyIp +
        ':' + ConfigHandler.getConfig().iosPrefetchProxyPort
      options['proxy'] = proxy
    }

    this.httpClient = request.get(options, (err, response, body) => {
      let result = {}
      if (!err) {
        this.response = response
        this.bodyLen = body.length
        logger.debug('%s Response info, %s', this.tag, this.resourceInfo())
        result = {
          statuscode: response.statusCode,
          headers: response.headers,
          body: body
        }
      } else {
        logger.error('%s, fetchUrl() failed! cause=%s, url=%s', JSON.stringify(this), err.message,
          this.url)
      }
      
      if (this.httpClient) {
           logger.debug('%s, fetchUrl() ending connection!', JSON.stringify(this.httpClient))
          this.httpClient.abort()
        }
        if (response && response.socket)         {
          response.socket.destroy()
        } 
      callBack(result, err)
    })
  }

  cancelFetch () {
    if (this.httpClient) {
      logger.debug('%s, Cancelling fetch for url=%s', this.tag, this.url)
      this.httpClient.abort()
      this.httpClient = null
      this.url = null
    }
  this.response.socket.removeAllListeners()
    }
  }

  close () {
    if (this.response && this.response.socket) {

      this.response.socket.destroy()
      //logger.debug('%s, close(), after socket.destroy(), statusTCP=%s', JSON.stringify(this.response), this.response.socket)
    }
    if (this.httpClient) {
      logger.debug('%s, Closing HTTP connection for url=%s', this.tag, this.url)
      this.httpClient.abort()
      this.httpClient = null
      this.url = null
      this.response = null
    }
  }

поделитесь своим кодом, чтобы лучше понять проблему

front_end_dev 12.11.2018 16:09

Я только что добавил, извините.

Igor Kamalov 12.11.2018 16:11

какой модуль вы используете для request

front_end_dev 12.11.2018 16:21

Я использую request.js

Igor Kamalov 12.11.2018 17:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
429
0

Другие вопросы по теме