You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一网站部署多个Node.js应用?新手开发者求指导

如何将独立Express全栈项目挂载到作品集网站的子路由下

针对你遇到的问题,有两种实用的解决方案,根据你的需求选择:

方案一:直接挂载子Express应用(推荐,无需额外端口)

这种方法适合可以修改子项目代码的情况,直接把独立的Express子项目作为主应用的一个子路由模块挂载:

  1. 修改子项目的入口文件
    打开子项目(比如project1)的app.js,移除原来的app.listen()调用,改为导出Express实例:

    // projects/project1/app.js
    const express = require('express');
    const app = express();
    
    // 保留子项目原有所有路由逻辑,比如:
    app.get('/', (req, res) => {
      res.send('Project 1 首页');
    });
    app.get('/api/getData', (req, res) => {
      res.json({ content: 'Project 1 的API数据' });
    });
    // 子项目的静态文件配置也保留,比如:
    app.use(express.static('public'));
    
    // 移除 app.listen(3000),改为导出app
    module.exports = app;
    
  2. 在主作品集项目中挂载子应用
    在主项目的入口文件(比如app.js)中,引入子项目的Express实例,并通过app.use()挂载到指定路由:

    // 主项目app.js
    const express = require('express');
    const app = express();
    
    // 引入子项目的app实例
    const project1App = require('./projects/project1/app');
    
    // 将子项目挂载到 /project1 路由下
    app.use('/project1', project1App);
    
    // 主项目自身的路由
    app.get('/', (req, res) => {
      res.send('我的作品集首页');
    });
    
    // 主项目统一监听端口
    app.listen(3000, () => {
      console.log('作品集网站运行在 3000 端口');
    });
    

    这样配置后,子项目的所有路由会自动带上/project1前缀:

    • 子项目的/ → 访问路径/project1
    • 子项目的/api/getData → 访问路径/project1/api/getData
      静态文件也会自动适配路径,无需额外修改。

方案二:使用反向代理(无需修改子项目代码)

如果不想改动子项目的原有代码,可以用反向代理将子项目的请求转发到独立端口:

  1. 安装代理依赖
    在主项目中安装http-proxy-middleware:

    npm install http-proxy-middleware
    
  2. 配置代理规则
    先手动启动子项目(比如让project1运行在3001端口),然后在主项目的app.js中添加代理配置:

    // 主项目app.js
    const express = require('express');
    const { createProxyMiddleware } = require('http-proxy-middleware');
    const app = express();
    
    // 配置代理:将 /project1 开头的请求转发到子项目的端口
    app.use('/project1', createProxyMiddleware({
      target: 'http://localhost:3001', // 子项目运行的地址
      changeOrigin: true,
      pathRewrite: {
        '^/project1': '' // 移除请求路径中的 /project1,转发给子项目的根路径
      }
    }));
    
    // 主项目自身路由
    app.get('/', (req, res) => {
      res.send('我的作品集首页');
    });
    
    app.listen(3000, () => {
      console.log('作品集网站运行在 3000 端口');
    });
    

    部署时可以用PM2等工具同时启动主项目和所有子项目,确保每个子项目使用不同的端口。

注意事项

  • 静态文件:如果子项目使用了express.static,方案一的挂载方式会自动处理路径;方案二需要确保子项目的静态资源引用是相对路径,或配置正确的base URL。
  • 端口管理:方案二需要给每个子项目分配独立端口,避免冲突。
  • 部署便利性:方案一只需启动主项目即可,部署更简洁,优先推荐。

内容的提问来源于stack exchange,提问作者xvicx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:17:03