【问题标题】:How to deploy a client/server website with Express, Vue.js, and firebase如何使用 Express、Vue.js 和 firebase 部署客户端/服务器网站
【发布时间】:2021-12-11 14:34:52
【问题描述】:

我使用 Vue.js(用于前端)开发了一个网站,并制作了一个服务器来将该网站连接到一个 API(这里是 Twitter)。服务器是用 Express.js 制作的。在 localhost 中,一切正常。我的服务器在 localhost:8085 上运行,我的网站在 localhost:8080 上。借助 Api,我可以通过例如 GET http://localhost:8085/TheNameOfTheApiFunction 访问数据。

因为我想轻松部署我的网站,所以我尝试使用 Heroku 和 Firebase。我用前端做“npm run build”,把结果放在我服务器的“public”目录下,firebase.json 很好(我认为)。

  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "function":"app",
        "destination": "/index.html"
      }
    ]
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ]
  }
}

此时,当我启动网站时,前端正在工作,但无法访问任何 API 功能。似乎合乎逻辑,因为没有 localhost/8085 要求函数。 GET http://localhost:8085/NameOfTheApiFunction net::ERR_CONNECTION_REFUSED

因此,我决定探究原因,发现我应该使用本教程中的建议: https://firebase.google.com/docs/hosting/functions#use_a_web_framework。 因此,我将 app.js 文件中的内容复制并粘贴到了由 firebase 函数创建的 index.js 文件中(在函数目录中)。但它不起作用。

我应该怎么做才能进行良好的部署?我应该更改 API.js 中客户端的内容以使其具有适应性吗?


export default () => {
    return axios.create({
        baseURL: `http://localhost:8085/`
    })
}

编辑 说清楚。

  1. 在文件夹“myapp”中,我有文件夹“client”,其中有我的 Vue.js 前端网站,我使用npm run serve 在本地启动它。

  2. 在同一文件夹“myapp”中,我有文件夹“server”,这是连接到 Twitter Api 所必需的,因为从前端无法实现。我通过执行“npm run start”来启动它。

  3. 我的前端使用 Axios 访问“服务器”。具有 get 或 post 的服务器 anwser 并能够向 twitter API 询问信息。

  4. 在 localhost 上一切正常。我想部署网站,我跟着这个视频: https://www.youtube.com/watch?v=GJwHevf2wYE 这家伙建议在服务器部分创建一个名为“public”的文件夹,您将所有来自“客户端”的构建(npm run build)的文件放在其中。您在服务器中添加app.use(express.static("public")),当我启动时,例如,localhost:8085(即服务器),我可以通过一个命令(而不是两个)访问整个网站。

  5. 因为这行得通,我认为我可以通过部署“服务器”文件夹来启动该网站。但它不起作用,我认为这是因为“客户端”端被编码为请求“localhost:8085/ApiFunctions”。但我不明白我应该如何部署服务器。这就是我尝试使用firebase托管的原因,但我遇到了完全相同的问题:我不完全了解它是如何运行的,以知道问题是来自我的部署方法还是代码(axios 具有baseURL:localhost:8085)。

【问题讨论】:

  • 如果您从 Express 应用程序为 Vue 应用程序提供服务,它可以发出 relative 请求。然后你根本不需要配置,当你在本地运行它时只需要一个开发代理。例如,看看我是如何设置它的 here
  • @jonrsharpe 我已经阅读了该页面。这是我尝试用于 Heroku 的架构,但就像我说的,我不明白我应该在 Axios 的 BaseURL 中放置什么以获得相对路径!你能解释一下吗?
  • 没什么,如果您使用的是相对路径,则不需要基本 URL。
  • 我应该如何使用相对路径?而且,也许我不明白你所说的相对路径是什么意思
  • axios.method('/NameOfTheApiFunction')。基本上,您 with 配置了基本 URL,除非没有基本 URL。然后将它们设为 相对于 页面加载的任何来源,因为 Express 服务器同时提供 API,客户端应用程序资产与您相同' d 无论如何都要输入基本 URL。

标签: javascript firebase express axios google-cloud-functions


【解决方案1】:

我明白:

  1. 您的 Vue.js 应用通过 Firebase 托管服务提供服务。
  2. 您将 Express 应用程序传递给 HTTP Cloud Function,如您参考的文档和 Cloud Functions 文档中的 here 中所述。

如果这种理解是正确的,您可以通过以下 URL 访问您的 Express JS 应用程序(即 Cloud Function),如 the bottom of the doc(要点 #2)中所述:

  • 您的 Firebase 子域:<Firebase_project_ID>.web.app/<NameOfTheApiFunction><Firebase_project_ID>.firebaseapp.com/<NameOfTheApiFunction>

  • 或者,任何连接的自定义域: <custom_domain>/<NameOfTheApiFunction>.


根据您的评论更新:

您似乎想在使用模拟器时访问 CF。您应该使用 Cloud Functions 的模拟器默认端口,即 5001,或者根据需要将其配置为另一个端口。请参阅模拟器doc

【讨论】:

  • 查看更新。
  • 我编辑了我的问题以使其更清楚!
  • 我的问题是我不明白如何准确部署我的快递服务器。
  • 我建议先尝试在 Firebase 上进行部署,以避免模拟器带来任何额外的复杂性。当您确定您的 Vue.js 应用程序 + 您的云功能 + 从前端到 CF 的连接正常工作时,您就可以解决潜在的模拟器问题。要部署 CF,请关注doc
  • 所以:1. 我在我的“客户端”文件夹中更改了 Axios 连接,来自 ``` export default () => { return axios.create({ baseURL: http://localhost:8085/ }) }` `` 到“.firebaseapp.com/” 2. 我像以前一样使用 firebase 从“客户端”部署前端。 3.我用云功能部署服务器,它会在地址可用。 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2014-02-18
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多