node.js:将请求路由到同一主机上的不同端口

时间:2015-05-13 10:28:31

标签: node.js express

我有一台主计算机,它提供许多webapplications(不是node.js)。它使用不同的端口执行此操作。这意味着例如以下应用程序是实时的:

接下来我有一个基于node.js的webapp(在端口80上运行),我想用它作为一种路由器。当有人导航到http://localhost/app/app1时。我希望它导航到http://hostname:3000。使用简单的重定向,这是相对简单的。但是,我想保留网址http://localhost/app/app1。有人能指点我使用node.js / express吗?

我的路由逻辑看起来有点像(伪代码)。

app.route('/app/:appName')
   .get(appEngine.gotoApp);

appEngine.gotoApp = function(req, res) {
    redirectToApp logic 
    }

3 个答案:

答案 0 :(得分:2)

您最好使用Nginx设置每个应用程序具有不同位置的反向代理。

这不是你要求的,因为它不使用node.js,但如果它是唯一的目的,Nginx真的很适合你的需要。

例如,Nginx配置文件应该按照您想要的方式工作:

server {
    listen 80;

    server_name myapp.com;

    location /app1 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    } 

    location /app2 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    } 

    location /app3 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:3003;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    } 
}

答案 1 :(得分:1)

如果您使用express,您可以尝试使用cli express应用程序生成器创建应用程序。

它创建了一个快速应用程序,并通过模块导出返回它。

在server.js文件中,它传递给服务器实例的listen函数express express对象。

您可以创建更多服务器对象,并使用不同的端口收听不同的应用程序。

var server = http.createServer(app);
server.listen(port);
var server2 = http.createServer(app2);
server2.listen(port2);

如果你想根据网址指向不同的应用,你可以实例化快速路由器而不是快速对象。

var app1 = express.Router();

然后,您可以使用经典的get或post或其他方法将所有路径设置为此对象。

现在,您可以将路由器作为主要快速应用程序的中间件传递。

app.use( "app1/", app1 );

您还可以将快速应用程序传递给中间件而不是路由器对象,以便获得使用不同的URL和端口服务器监听应用程序的可能性。

答案 2 :(得分:0)

有一个专门为此设计的不错的http-proxy库!

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

const proxy = httpProxy.createProxy();
const options = {
    '/app/app1': 'http://localhost:3000',
    '/app/app2': 'http://localhost:3001',
    '/app/app3': 'http://localhost:3003',
}

require('http').createServer((req, res) => {
    const pathname = url.parse(req.url).pathname;
    for (const [pattern, target] of Object.entries(options)) {
        if (pathname === pattern || 
            pathname.startsWith(pattern + '/')
        ) {
            proxy.web(req, res, {target});
        }
    }
}).listen(80);