首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >node.js:将请求路由到同一主机上的不同端口

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

Stack Overflow用户
提问于 2015-05-13 10:28:30
回答 3查看 11.6K关注 0票数 9

我有一台主机,它为许多not应用程序提供服务(不是基于node.js的)。它使用不同的端口来完成这个任务。这意味着,例如,下列应用程序处于活动状态:

  • app1:http://hostname:3000
  • app2:http://hostname:3001
  • app3:http://hostname:3003

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

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

代码语言:javascript
运行
复制
app.route('/app/:appName')
   .get(appEngine.gotoApp);

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-13 12:14:05

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

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

在server.js文件中,它传递给服务器实例的侦听函数、快捷应用程序对象。

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

代码语言:javascript
运行
复制
var server = http.createServer(app);
server.listen(port);
var server2 = http.createServer(app2);
server2.listen(port2);

如果您想要基于url指向不同的应用程序,您可以实例一个快速路由器而不是快递对象。

代码语言:javascript
运行
复制
var app1 = express.Router();

然后,您可以使用经典的get、post或其他方法设置进入该对象的所有路由。

现在,您可以通过路由器作为您的主要快递应用的中间件。

代码语言:javascript
运行
复制
app.use( "app1/", app1 );

您还可以将一个快速应用程序传递给中间件,而不是路由器对象,以获得通过不同的url和端口服务器侦听应用程序的可能性。

票数 1
EN

Stack Overflow用户

发布于 2015-05-13 12:25:50

您可能最好使用Nginx设置一个反向代理,每个应用程序都有不同的位置。

这不是您所要求的,因为它不使用node.js,但如果它是唯一的目的,Nginx确实适合您的需求。

例如,像Nginx这样的配置文件应该以您想要的方式工作:

代码语言:javascript
运行
复制
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;
    } 
}
票数 4
EN

Stack Overflow用户

发布于 2020-01-11 22:26:05

有一个不错的http-proxy库正是为此而设计的!

代码语言:javascript
运行
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30212178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档