Подтвердить что ты не робот

Proxy node запрашивать новый порт и действовать как обратный прокси-сервер

Мне нужно создать приложение, которое проксирует запрос из порта A в порт B. Например, если пользователь подключается к порту 3000, он будет маршрутизироваться (под капотом) на порт 3001, поэтому "оригинальное" приложение будет работать на порту 3001, но в клиенте (браузере) пользователь поместит порт 3000. Не перенаправлять...

http://example.com:3000/foo/bar

Будет создан новый сервер, который прослушивает порт 3001, и все вызовы фактически будут выполняться на сервере 3000 с новым сервером и новым портом. Поскольку порт 3000 фактически занят моим обратным прокси-приложением? как его проверить...

Есть ли способ проверить это, чтобы убедиться, что это работает, например. путем модульного тестирования?

Я нашел этот модуль https://github.com/nodejitsu/node-http-proxy, который может помочь.

4b9b3361

Ответ 1

Прямо от node-http-proxy docs, это довольно просто. Вы можете протестировать его просто, сделав HTTP-запрос на порт 3000 - если вы получите тот же ответ, что и на порт 3001, он работает:

var http = require('http'),
    httpProxy = require('http-proxy');

//
// Create a proxy server with custom application logic
//
var proxy = httpProxy.createProxyServer({});

var server = http.createServer(function(req, res) {
  // You can define here your custom logic to handle the request
  // and then proxy the request.
  proxy.web(req, res, {
    // Your real Node app
    target: 'http://127.0.0.1:3001'
  });
});

console.log("proxy listening on port 3000")
server.listen(3000);

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

A unit test с помощью и будет выглядеть примерно так:

var should = require('should');

describe('server', function() {
    it('should respond', function(done) {
                                 // ^ optional synchronous callback
        request.get({
            url: "http://locahost:3000"
                                // ^ Port of your proxy
        }, function(e, r, body) {
            if (e)
                throw new Error(e);
            body.result.should.equal("It works!");
            done(); // call the optional synchronous callback
        });
    });
});

Затем вы просто запускаете свой тест (как только установлен Mocha):

$ mocha path/to/your/test.js

Ответ 2

Вы можете либо проверить, что это работает, добавив следующие на запрос прокси (как описано в ответе Ремуса)

proxy.on('proxyReq', function (proxyReq, req, res, options) {
    res.setHeader('App-Proxy', 'proxy');
});

Таким образом, вы можете убедиться, что ваш "оригинальный" вызов работает против нового прокси-сервера и даже обеспечивает возможность создания UT, кроме того вы можете использовать свойство changeOrigin:true...