【问题标题】:How can I connect my NodeJS/Express backend to my VueJS frontend using only one port on my local machine?如何仅使用本地计算机上的一个端口将 NodeJS/Express 后端连接到 VueJS 前端?
【发布时间】:2021-09-25 23:52:56
【问题描述】:

我的 Vue 应用程序是使用 Vue CLI (Webpack) 设置的,并且可以正常工作。我的 NodeJS/Express REST API 也可以正常工作。然而,为了同时运行它们,我现在为它们中的每一个启动一个本地服务器——每个都有自己的端口。我想让他们两个通过一个端口进行通信。

Localhost:8080 应该指向我的 Vue App 的主页,API 请求应该遵循 localhost:8080/api/...

在我的生产环境中,我通过将 Vue 应用程序作为一组静态文件(“dist”文件夹)提供服务来使用一个相同的端口/URL。但是,在我的开发环境中,我不知道如何设置它。

我在网上四处寻找答案,但对我遇到的所有不同术语(.env、crossenv、nginx、cors)感到迷茫,而且我在兜圈子。

什么是设置的好方法?

谢谢

编辑:

我最终创建了三种模式来运行我的应用程序:

  1. 发展 我使用 package.json 中的一个脚本在不同端口上启动前端和后端服务器,使用 pm2 在“后台”运行服务器,而不是阻止终端/cmd 中的进一步命令。我在 vue.config.js 中配置了一个代理,将我在前端进行的 API 调用重定向到正确的基本 URL,并使用 cors 作为中间件来允许从其他域/端口向我的 API 发出请求。

  2. 分期 我使用 package.json 中的一个脚本将 Vue 应用程序构建到一个文件夹(我的后端文件夹中的“dist”文件夹)中,该文件夹是一组静态文件并启动后端服务器。我的后端设置为知道我何时想进入暂存模式,然后在“dist”文件夹中提供静态文件。

  3. 生产 我使用 package.json 中的一个脚本将 Vue 应用程序构建到一个文件夹(我的后端文件夹中的“dist”文件夹)中,该文件夹是静态文件的集合,并将我的后端(包括构建的静态文件)推送到 Heroku。

【问题讨论】:

  • 这就是 Vue CLI 代理功能的用途。

标签: node.js vue.js development-environment production-environment


【解决方案1】:

如果您需要在同一个端口上运行两者,您可以首先构建您的应用程序,以便您接收一个 dist 目录或任何您的输出目录命名并设置一个快速服务器来服务该应用程序并处理您的 api 请求

const express = require("express");

const path = __dirname + '/app/views/';
const app = express();

app.use(express.static(path));

app.get('/', function (req,res) {
  res.sendFile(path + "index.html");
});

app.get('/api', function (req,res) {
  // your api handler
}

app.listen(8080)

【讨论】:

  • 感谢您的回复。所以你说 res.sendFile index.html 并在我的 Vue 应用程序的“views”文件夹中提供静态文件。我试过了。当我转到 localhost:8080 时,它显示了 index.html,但没有显示任何应由 Vue 注入 index.html 的内容。换句话说,带有#app 的 div 保持为空。此外,在我的 index.html 中,我的标题设置为: 并且当我尝试提供 index.html 时,它只会为我的页面提供标题 .
  • 这是一个 codesandbox 示例,使用 express 静态运行 Vue 应用程序。
  • 啊@Estus Flask 的评论让我想起了代理功能。这是一个使用代理功能的sandbox。这样,您必须启动 2 个开发服务器,但您的 Vue 应用程序请求可以代理到您的 api,而无需在 Vue 应用程序本身中更改您的 baseUrl。这取决于你想使用什么。
  • 非常感谢。这真的把我推向了正确的方向。我一直在寻找一个易于使用的产品和开发环境。我的应用程序现在在 dev 中的两个端口上运行,但我可以用一个命令启动它——用于暂存和部署的 prod 服务器也是一个命令。这篇关于 vue 在生产中的文章和视频也有帮助 (link)。
【解决方案2】:

假设该节点和“应用程序”将始终在同一台服务器上运行,您可以只使用 ejs 之类的模板库。

然后您只需将应用程序和 api 捆绑在一起,假设前端绑定到后端,实际上您甚至不需要访问 API,因为您可以将记录作为视图的一部分返回,但是如果需要动态元素,您仍然可以点击 API。

现在,话虽如此,如果 API 是许多应用程序使用的东西,那么将其构建为自己的微服务,在自己的服务器上运行,您的前端将是独立的,这可能是有意义的。这样,您就可以分离 API 和 Vue 应用程序的关注点。

【讨论】:

  • 谢谢。我的应用程序确实具有动态元素,并且我的 API 仅由我的应用程序调用。我正在尝试建立一个彼此非常相似的生产和开发环境。由于在生产中我的应用程序和 API 都有一个根 URL,因此我希望我的开发环境也有相同的根 URL。
猜你喜欢
  • 2021-09-14
  • 2021-12-22
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多