代理节点请求新端口并充当反向代理
proxy node request to new port and act like reverse proxy
我需要创建一个应用程序来代理从端口 A 到端口 B 的请求。
例如,如果用户连接到端口 3000,他将被路由(在引擎盖下)到端口 3001,因此 "original" 应用程序将 运行 在端口 3001 上,但在客户端(浏览器)中用户将放置端口 3000。
不重定向...
http://example.com:3000/foo/bar
将创建一个监听端口 3001 的新服务器,所有调用实际上都是对端口 3000 运行 新服务器和新端口的调用。
由于端口 3000 实际上被我的反向代理应用程序占用了?我应该如何测试它...
有没有办法测试它以验证它是否有效,例如通过单元测试?
我找到了这个模块 https://github.com/nodejitsu/node-http-proxy,它可能会有所帮助。
直接来自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);
我强烈建议您也为您的项目使用 mocha 之类的东西编写一套集成测试 - 这样,您可以 运行 直接针对您的服务器和针对您的服务器进行测试你的代理人。如果两者都通过了测试,那么您可以确信您的代理的行为符合预期。
使用 mocha 和 should.js 的单元测试看起来像这样:
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
您可以通过添加以下内容来验证这是否有效
代理请求(如 Remus 回答中所述)
proxy.on('proxyReq', function (proxyReq, req, res, options) {
res.setHeader('App-Proxy', 'proxy');
});
通过这种方式,您可以验证您的 "original" 调用是否针对新的服务器代理工作,甚至提供创建 UT 的能力,此外您可以使用 changeOrigin:true
属性...
我需要创建一个应用程序来代理从端口 A 到端口 B 的请求。 例如,如果用户连接到端口 3000,他将被路由(在引擎盖下)到端口 3001,因此 "original" 应用程序将 运行 在端口 3001 上,但在客户端(浏览器)中用户将放置端口 3000。 不重定向...
http://example.com:3000/foo/bar
将创建一个监听端口 3001 的新服务器,所有调用实际上都是对端口 3000 运行 新服务器和新端口的调用。 由于端口 3000 实际上被我的反向代理应用程序占用了?我应该如何测试它...
有没有办法测试它以验证它是否有效,例如通过单元测试?
我找到了这个模块 https://github.com/nodejitsu/node-http-proxy,它可能会有所帮助。
直接来自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);
我强烈建议您也为您的项目使用 mocha 之类的东西编写一套集成测试 - 这样,您可以 运行 直接针对您的服务器和针对您的服务器进行测试你的代理人。如果两者都通过了测试,那么您可以确信您的代理的行为符合预期。
使用 mocha 和 should.js 的单元测试看起来像这样:
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
您可以通过添加以下内容来验证这是否有效 代理请求(如 Remus 回答中所述)
proxy.on('proxyReq', function (proxyReq, req, res, options) {
res.setHeader('App-Proxy', 'proxy');
});
通过这种方式,您可以验证您的 "original" 调用是否针对新的服务器代理工作,甚至提供创建 UT 的能力,此外您可以使用 changeOrigin:true
属性...