我想托管的Angular 应用程序及其后端在一个主机(我不确定这是否是一个好主意!).

我在NodeJS(express)应用程序中创建了一个web文件夹,并将Angular 部署的文件移到那里.此外,我将此文件夹设置为静态,以使assets资源 对公众可用.

所有后端的API路径也都以/API/v1/*开头

当我打开主页(index.html)时,Angular SPA工作得很好,我可以轻松地在路由之间导航,但当我试图在新选项卡中打开任何前端路由时,Express无法处理该请求.

任何人都可以在此场景中分享的任何最佳实践都将不胜感激.

推荐答案

嗯,这样的方法可能适用于您的场景:

  1. 在您的特快JS中创建一条全面的路由.(这意味着如果它没有命中任何定义的路由,则此路由将捕获它)
  2. 在这个处理程序中,通过添加一些上下文(比如将目标URL作为查询字符串附加),将其重定向到index.html路径
  3. 在您的Angular 根页面中,捕获以下查询字符串并导航到目标Angular 页面

它可能看起来像这样:

特快专线

const url = require("URL");

app.get('*', function (req, res) {
    res.redirect(url.format({
       pathname:"/", // assuming that index.html lies on root route
       query: {
          "navigateTo": req.url,
        }
     }));
})

角形APP根组件

// assuming this is the root component
@Component({ ... })
export class AppComponent implements OnInit {

  constructor(private route: ActivatedRoute, private router: Router) { }

  ngOnInit() {
    this.route.queryParams
      .subscribe(params => {
        const { navigateTo } = params;
        if (navigateTo)
        {
            this.router.navigateByUrl(navigateTo);

        }
      }
    );
  }
}

Node.js相关问答推荐

当建议在第二代上运行云功能时,现在是否有新的Firestore AdminClient可供使用?

Sveltekit停靠的应用程序找不到从Build导入的包

Firebase-admin筛选器.或只考虑第一个WHERE子句

从mongodb集合中获取每分钟数据的每小时数据

Puppeteer 在本地运行良好,但在 Heroku 中运行不佳

使用 Nodejs 获取 Firebase 云消息传递历史记录

每个数组值在 mongodb 中查找一个文档

我误解了外键的工作原理吗?使用续集

无法使用 node 预签名 url 从 React 将图像文件上传到 s3

BrowserRouter 无法渲染组件

在快速路由中使用 axios 会在数据字段中返回特殊字符而不是 json

为什么 $or 在带有正则表达式的mongoose 中不能正常工作

如何在 mongoDB 中进行全动态搜索?

Node.js + Express + Handlebars.js + 局部视图

MongoDB Node findone如何处理没有结果?

node 应用程序是否有任何独立的 gui 模块

node.js 模块和函数中this的含义

Puppeteer 记录在 page.evaluate

AWS Lambda 函数写入 S3

AWS Lambda:如何将秘密存储到外部 API?