【问题标题】:proxy node request to new port and act like reverse proxy代理节点请求新端口并充当反向代理
【发布时间】:2015-07-18 14:06:43
【问题描述】:

我需要创建一个应用程序来代理从端口 A 到端口 B 的请求。 例如,如果用户在端口 3000 上连接,他将被路由(在引擎盖下)到端口 3001,因此“原始”应用程序将在端口 3001 上运行,但在客户端(浏览器)中,用户将放置端口 3000。 不重定向...

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

将创建一个监听端口 3001 的新服务器,并且所有调用实际上都是使用新服务器和新端口运行的端口 3000。 由于端口 3000 实际上被我的反向代理应用程序占用了?我应该如何测试它...

有没有办法测试它以验证它是否有效,例如通过单元测试?

我发现这个模块 https://github.com/nodejitsu/node-http-proxy 可能会有所帮助。

【问题讨论】:

  • 你找到了什么模块?到目前为止,您为实现这一点做了什么尝试?
  • @doldt- :) 谢谢我已经添加了模块名称
  • node-http-proxy 是很好的解决方案。为什么你不确定? (:
  • @num8er-我不知道如何测试它,看看它是否真的有效......那里还有很多选择,所以选择哪一个......
  • 您是否可以选择使用 nginx 或 HAproxy 之类的东西而不是节点服务器?它们旨在管理此类事情。

标签: javascript node.js express reverse-proxy node-http-proxy


【解决方案1】:

直接来自node-http-proxy docs,这很简单。你可以简单地通过向端口 3000 发出 HTTP 请求来测试它——如果你得到与在端口 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);

我强烈建议您也为您的项目使用 之类的东西编写一套集成测试 - 这样,您可以直接针对您的服务器和您的代理运行您的测试。如果测试都通过了,那么您可以确信您的代理的行为符合预期。

使用 的单元测试看起来像这样:

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

【讨论】:

  • 谢谢,但我已经在帖子中提供的链接中看到了这个逻辑:),我的问题是我实际上如何测试/模拟它......(也许是超级测试),我我会尽量长话短说:)我需要开发这个代理,并在几周后将它与另一个组件集成,我需要通过一些测试来验证这个概念是否有效......因为原始端口被占用它很棘手...我想隔离此代码并以某种方式对其进行测试...您能帮忙吗?
  • 谢谢,但我该怎么做,请您提供一个如何测试此场景的示例?
  • 谢谢,但这个测试不足以验证它是否有效...... :),我将呼叫路由到其他端口的地方在哪里?创建服务器......这是问题所在我面对
  • 我在这里很困惑。您在服务器前面放置了一个代理,并针对它运行测试。如果您在 3001 端口上的服务响应并且您的测试通过了,那么它可以工作。
  • 澄清一下,您的测试是针对代理运行的。代理本质上应该对针对本机应用程序的调用做出相同的响应。为本机应用程序编写的测试,当指向代理时,应该表现相同。如果他们这样做了,那就成功了。如果他们不这样做,那就失败了。
【解决方案2】:

您可以通过添加以下内容来验证这是否有效 到代理请求(如 Remus 回答中所述)

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

通过这种方式,您可以验证您的“原始”调用是否适用于新的服务器代理,甚至提供创建 UT 的能力,此外您还可以使用 changeOrigin:true 属性...

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 2023-02-21
    • 1970-01-01
    • 2014-03-03
    • 2020-08-12
    • 1970-01-01
    • 2021-06-13
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多