Node.js/Express.js + Angular 路由器 - 使用直接链接时服务器用响应对象覆盖客户端 View

标签 node.js express angular-router

我正在使用express构建一个node.js应用程序,我在公共(public)文件夹中托管一个Angular SPA。

当我使用角度路由器在网站上导航时,但当我直接尝试访问链接时,应用程序运行且托管工作正常,例如:http://192.168.1.4:3000/posts ,网站的整个主体只是 JSON 响应对象,没有应用程序

这是处理 get 请求的 Node.js 代码

postRouter.route('/')
.options(cors.corsWithOptions, (req, res) => {
    res.sendStatus(200);

})
.get(cors.cors,  (req, res, next) => {
    posts.find({})
    .then((post) => {
        res.status(200);
        res.setHeader('Content-Type', 'application/json')
        res.send(post);
    }, (err) => next(err))
    .catch((err) => next(err));
})

这是我发送获取请求的角度服务

getPosts(): Observable<Post[]> {
    return this.http.get(baseURL + 'posts')
    .catch(error => { return this.processHttpService.handleError(error); });
}

发布组件.ts 文件

  ngOnInit() {
    this.postService.getPosts()
      .subscribe(posts => { this.posts = posts, console.log(this.posts); },
        errmess => this.errMess = <any>errmess);
  }

再次,当我使用托管在公共(public)文件夹中并使用 ng build --prod 构建的 Angular 5 客户端应用程序时,将从 mongodb 数据库中检索 JSON 对象,并与应用程序的其余部分、页眉、正文和页脚一起正确显示在我的网站上。

还值得注意的是,使用直接链接时,ngOnInit() 上的 console.log 不会显示在浏览器上。

非常感谢任何建议/修复

最佳答案

您的 Angular 和 Express 应用程序之间存在路由冲突。 Angular 在一条路线上提供服务(我猜是 / 路线),然后它有点“劫持”用户的导航。它通过不实际更改网页来实现此目的,而只是更改导航栏中的 URL,但从未实际发出 Web 请求来访问该资源。

然后,您就可以在 Web 服务器上获得监听这些端点的端点。这意味着当您访问 /posts 页面时,您不会要求 Angular 执行任何操作。事实上,Angular 甚至没有加载,因为它只在 / 路由上加载。相反,您将直接使用 API。

有很多方法可以解决这个问题,首先,许多人将他们的 API 相当独立地放置,要么放在子域上,要么安装在 /api 上(例如 /api/posts)。然后你的角度应用程序可以在 / 路线上提供。您还可以使用其他技术来允许用户转到 /posts 并仍然加载您的 Angular 应用程序。

您可以使用几种方法来实现此目的,例如 hash location strategy ,或者您可以从应用程序上的任何路径(express 中的 *)提供 Angular 应用程序,并加载 Angular 应用程序,然后它将接管。第二种方法是最受关注的,它通常会导致将您的 api 托管在子域上,然后在普通域名的 * 路由上提供您的角度应用程序。例如: api.myapp.com 将仅提供 JSON 响应,但 myapp.com 上的任何路由都将提供 Angular 应用程序,例如 myapp.com/posts。

关于Node.js/Express.js + Angular 路由器 - 使用直接链接时服务器用响应对象覆盖客户端 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50155468/

相关文章:

angular - 使用 Angular 4 添加到 Jhipster 的新路由

node.js - 将 Angular Universal 部署到共享托管,无需 npm 或 node.js

javascript - 在express中使用app.get()和app.set()与变量声明有什么区别?

angular - 在 routerLink 中设置 url 字符串

mysql - 从 sequelize 查询返回一个值

node.js - 发布表单数据时请求正文为空

angular - 获取组件中的路由参数

mysql - 在环回中更新模型的 id 值

javascript - POST 请求返回 [Object, object]

ruby - 事件驱动的应用程序 - 选择什么语言或 VM?