我有一台主计算机,它提供许多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
}
答案 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);