【问题标题】:MERN API GET requests return 404's on Heroku, works on local Raspi serverMERN API GET 请求在 Heroku 上返回 404,适用于本地 Raspi 服务器
【发布时间】:2019-08-07 03:47:16
【问题描述】:

我有一个我想在 Heroku 上托管的 MERN 应用程序。现在,应用程序已部署到 Raspberry Pi,那里一切正常,但是一旦它到达 Heroku,我所有的 API GET 请求都会导致 404 错误。我可以得到 React 前端,但没有其他工作。 Mongo 部分托管在 Atlas 的沙盒层上,并被列入白名单以接受任何授权连接。

我尝试过的事情:

const axiosConfig = {
  proxy:{
    host: '127.0.0.1',
    port: process.env.PORT || 3001
  }
};

我的 API 中的 GET 请求导致 Heroku 上的 404 错误消息如下:xhr.js:173 GET https://builders-kit-0031.herokuapp.com/api/humidity 404 (Not Found)

我正在使用密钥文件向 Atlas 进行身份验证:

if(process.env.NODE_ENV === 'production'){
  module.exports = require('./keys_prod');
} else {
  module.exports = require('./keys_dev');
}

该文件拉入以下文件,该文件使用我在 Heroku 的 config vars 部分中设置的 MONGO_URI 和 SECRET_OR_KEY 字符串。

module.exports = {
  mongoURI: process.env.MONGO_URI,
  secretOrKey: process.env.SECRET_OR_KEY
};

我的代码设置为通过 Express 服务器为 React 提供服务(所有 react 内容都在 /client 文件夹中)。我目前正在使用 Heroku postbuild 脚本进行部署,如下所示:"heroku-postbuild": "NPM_CONFIG_PRODUCTION=true NODE_ENV=production npm install --prefix client && npm run build --prefix client"

我认为这是我今天早上在这里研究后发现的所有大热点。任何和所有关于尝试的事情的建议将不胜感激。您可以查看我正在尝试部署的内容的损坏版本here。很高兴发布任何其他 sn-ps 代码,如果这有助于调试 - 不想发布整个应用程序。提前致谢!

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及必要的最短代码 重现它在问题本身。没有清晰的问题陈述的问题对其他读者没有用处。见:How to create a Minimal, Complete, and Verifiable example.
  • 欢迎。我们无法在此处调试您的完整应用程序和/或部署。在发布之前,通常希望您已采取“基本步骤”重现最少列表的问题。这些是上面发布的标准消息的基本要点。制作一个小程序和部署并不断添加内容,直到您在应用程序中看到与现在相同的问题。然后你就知道要问/“寻找”什么了。
  • 嘿@NeilLunn - 抱歉,我认为我的描述在这里已经足够清楚了。我遇到的确切问题是,当部署到 Heroku 时,对我的 API 的所有 GET 请求都失败了,但是当从本地运行时,它们都可以与 Atlas 托管的数据库一起使用。我有一个类似的准系统应用程序,它只是针对部署在 heroku 上的 Atlas 上的 Mongodb 集群对用户进行身份验证,它遇到了同样的问题。我在网上找到的大部分信息都是为​​ mLab 而不是 Atlas 量身定制的——我想知道是否有一个我在进行这种转换时缺少的步骤。

标签: node.js reactjs mongodb heroku mongodb-atlas


【解决方案1】:

好的,我想我知道这里发生了什么。这似乎与 Axios 中 baseURL 的设置方式有关。

在本地开发过程中,我错误地分配了一个 IP 变量,然后像这样进行任何 API 调用:${ip}/api/whatever/whatever

我认为我在上面发布的 Axios 配置上是正确的,但我真正需要做的是像这样设置 Axios:

const axiosInstance = axios.create({
  baseURL: 'http://localhost:5000'
});

我将所有 API 调用切换为引用 axiosInstance 而不仅仅是 axios,然后将它们全部更新为使用相对 URL。现在,所有 API 调用和数据库连接都按预期工作。希望这对将来的人有所帮助!

【讨论】:

  • 还发现了另一个导致一些 API 调用混乱的问题 - 我没有忽略我的 .env,因为我没有在其中存储任何敏感数据,而且我认为它被推送了直到heroku,但似乎不是。重新定义 Heroku env vars 中的所有变量,这些部分现在可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多