"ERR_HTTP_HEADERS_SENT: Невозможно установить заголовки после их отправки клиенту", в то время как промежуточное ПО http-proxy в сочетании с https-proxy-agent

Промежуточное ПО на Node (Express JS) использует промежуточное ПО http-proxy для прокси-запросов и ответов между клиентом (возможно, браузером Chrome) и сервером jira. Он также использует https-proxy-agent для добавления прокси-агента, поскольку хост-серверу требуется прокси для доступа к Jira API.

Заголовки запросов обновлены с помощью onProxyReq. Он полностью работает на localhost, поскольку не требует прокси-агента, но выдает ошибку "ERR_HTTP_HEADERS_SENT: Невозможно установить заголовки после того, как они отправлены клиенту" на сервере.

Реализация кода ниже

var express = require("express");
var proxy = require("http-proxy-middleware");
var HttpsProxyAgent = require("https-proxy-agent");

var router = express.Router();
// proxy to connect open network
var proxyServer = "http://myproxy.url:8080";

router.use(
  "/jira",
  proxy({
    target: "https://myJira.url",
    agent: new HttpsProxyAgent(proxyServer),
    secure: false,
    changeOrigin: true,
    onProxyReq: function(proxyReq, req, res) {
      proxyReq.setHeader("user-agent", "XXX");
      proxyReq.setHeader("X-Atlassian-Token", "nocheck");
      console.log(
        "Printing Req HEADERS: " + JSON.stringify(proxyReq.getHeaders())
      );
    },
    onProxyRes: function(proxyRes, req, res) {
      proxyRes.headers["Access-Control-Allow-Origin"] = "*";
    },
    pathRewrite: {
      "^/api/jira/": "/" 
    }
  })
);

module.exports = router;

Благодарим за любую помощь в ее решении.

1 ответ

http-proxy-middleware использовать внутри http-proxy модуль.

В http-proxy модуль, есть открытый вопрос об использовании proxyReq (или onProxyReq за http-proxy-middleware) при использовании корпоративного прокси: https://github.com/http-party/node-http-proxy/issues/1287

Обходной путь, найденный b44x, заключается в использовании proxy.web низкоуровневый метод от http-proxy модуль.

Я столкнулся с той же проблемой и решил ее следующим образом:

const http = require('http');
const httpProxy = require('http-proxy');


// define an agent to proxy request to corporate proxy
const proxyAgent = require('proxy-agent');
// get values from environnement variables and avoid hard-coded values
const corporateProxyUrl = process.env.https_proxy || process.env.HTTPS_PROXY || process.env.http_proxy || process.env.HTTP_PROXY || '';
const agent = corporateProxyUrl ? new proxyAgent(corporateProxyUrl) : false;


const myLocalProxy = httpProxy.createProxyServer({});

const myServer = http.createServer(function(req, res) {

  // change request before it's being sent to target
  delete req.headers.origin;
  // req.headers.origin = 'https://www21.integ.fdj.fr';

  myLocalProxy.web(req, res, {
    // instruct 'http-proxy' to forward this request to 'target'
    // using 'agent' to pass through corporate proxy
    target: 'https://www.example.com',
    changeOrigin: true,
    agent: agent,
    toProxy: true,
  });

});

myServer.listen(8003);
console.log('[DEMO] Server: listening on port 8003');
Другие вопросы по тегам