当前位置: 首页 > 面试题库 >

如何在生产和开发的同一端口4200上运行angular 4 app和nodejs api?

曹茂材
2023-03-14
问题内容

我已经创建了angular 4应用程序,并且可以使用ng serve --open它运行并在其上运行localhost:4200,我想要的是我也已经nodejs在同一角度项目中创建了api
,现在我想在该API上运行,localhost:4200/api所以我尝试了类似的方法

我的angular 4和nodejs结构看起来像这样

/dist
/server
  /routes
  /server
/src
app.js
package.json

在我使用的app.js中

app.use(express.static(path.join(__dirname, 'dist')));
app.use('/app/api', apiRoutes);
const port = process.env.PORT || '3000';
server.listen(port, () => console.log(`API running on localhost:${port}`));

一旦我使用nodemon app.js并运行localhost:3000它,就运行了我的有角度的应用程序,它很好,而且比我运行localhost:3000/app/api起来还不错,

但是,当我更改角度应用程序时,它不会自动刷新我的应用程序,因为它当前正在运行节点应用程序以进行刷新,因此我需要运行ng build它,然后它将影响我对角度应用程序的新更改

所以,我要运行的ng serve --open是它将运行angular应用程序,但不能运行node js
api,因此要同时运行它们,一旦我更改了angular应用程序或node js应用程序中的任何一个,它必须是自动刷新的。


问题答案:

您不能在同一端口上运行两个不同的应用程序。Angular-cli在运行时在后台使用nodejs服务器(从技术上讲是webpack-dev-
server)ng serve,这意味着该端口已在使用中。

有两种可能的解决方案。

  1. 使用您的节点应用程序来提供静态前端文件。然后,您将无法真正使用ng serve(这可能是实时运行时要执行的操作)。

  2. 使用具有不同端口的nodejs,并使用Angular的代理配置,以使Angular认为api端口实际上是4200(这在开发期间可能是最好的)。

我认为这主要是开发过程中的一个问题,因为您很可能不会(也不应该)使用ng serve实时程序,因此选项2是我的最佳建议。

要配置代理,请在您的角度应用程序根目录中创建一个文件proxy.config.json,其内容如下:

{
  "/api/*": {
    "target": "http://localhost:3000",
    "secure": false,
    "changeOrigin": true
  }
}

然后,当您运行时ng serve,可以ng serve --proxy-config proxy.config.json改为运行它。

这是文档的链接

这是为生产而构建时的替代方法(上述解决方案1):

打造生产使用ng build --prod,以创建一个生产就绪角度构建,然后(假设您在节点服务器上使用快递),使用类似app.use(express.static('dist/'))的解释中Express文档。我自己不是在使用节点(我是在使用.NET Core),所以恐怕我无法提供更多详细信息。



 类似资料:
  • 问题内容: 我有2个Dockerfile,1个用于dev,1个用于prod: 产品: 和DEV: 我想将这两个合并为一个,因为维护2个Dockerfile是一个坏习惯 主要区别在于,在开发人员中,我从事实用的图像工作,而在产品中,我从事图像工作,这大大减少了二进制文件的大小。 看来我可以在Dockerfile中使用多个阶段,并在构建时指定阶段名称: 但是,如果这样做,我不知道如何在第一阶段有条件地

  • 问题内容: 我将docker用于laravel项目的开发和生产。我用于开发和生产的dockerfile略有不同。例如,我在开发环境中将本地目录安装到docker容器中,因此我不需要为代码中的每个更改进行docker构建。 由于挂载目录仅在运行docker容器时可用,因此无法在开发文件中将诸如“ composer install”或“ npm install”之类的命令放入dockerfile中。

  • 我使用docker为laravel项目开发和生产。我有一个稍微不同的dockerfile用于开发和生产。例如,我在开发环境中将本地目录装载到docker容器中,这样我就不需要为代码中的每个更改进行docker构建。 由于挂载目录只有在运行docker容器时才可用,因此我无法将“composer install”或“npm install”之类的命令放入dockerfile中进行开发。 目前,我正在

  • 问题内容: 在ExpressJS的第三个版本中, express.createServer() 更改为 express(), 此更改使得很难在同一端口上绑定socket.io。也许有人可以找到明智的决定。 现在,这不起作用: 我当前的工作流程:https : //gist.github.com/3596852 问题答案: 它在socket.io github页面上进行了描述(如@Golo在您的评论

  • 这是我在这里的第一个问题。我已经花了几个小时阅读主题,但以前从未发过一个问题。 此刻我有2个项目:一个前端和一个后端。为了使开发更快、更容易、更简单,我想把这两个项目放在一起。我知道有些开发人员不喜欢这种架构方式,但在我的情况下,它是最好的解决方案,一个项目,包括前端和后端。 具体:在开发区运行一个debug-webserver,我的angular应用程序运行在eq localhost上,而我的s

  • 我想用Rust,Hyper和WebSocket-RS编写一个Web服务器。webserver必须能够在同一端口上处理http请求和websocket请求。我使用了正式示例(:https://github.com/cyderize/rust-websocket/blob/master/examples/async-server.rs),并尝试对其进行修改。我的想法是改变错误处理。如果客户机的请求是一