(MERN应用程序)在Heroku部署上返回504(网关超时)的所有API调用在本地运行良好

mutmk8jj  于 2023-01-26  发布在  其他
关注(0)|答案(2)|浏览(123)

我已经建立了一个MERN堆栈应用程序,它有几个不同的API调用。它的工作原理与预期的本地,但它返回504(网关超时)的所有API调用时,部署在Heroku上。我在Mongo DB Atlas的数据库和配置值已添加到Heroku配置变量正确,没有打字错误。(两者MONGODB_URI和NODE_ENV =生产)我做错了什么?

  • Package
"scripts": {
    "start": "if-env NODE_ENV=production && npm run start:prod || npm run start:dev",
    "start:prod": "node server.js",
    "start:dev": "concurrently \"nodemon --ignore 'client/*'\" \"npm run client\"",
    "client": "cd client && npm run start",
    "seed": "node scripts/seedDB.js",
    "install": "cd client && npm install",
    "build": "cd client && npm run build",
    "heroku-postbuild": "npm run build"
  },
  • 服务器
const express = require('express');
const mongoose = require('mongoose');
const cookieSession = require('cookie-session')
const passport = require('passport');
const bodyParser = require('body-parser')
const keys = require('./config/keys');
const PORT = process.env.PORT || 5000;

require('./models');
require('./services/passport');

mongoose.connect(process.env.MONGODB_URI || "mongodb://localhost/google-book-search", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true
});

const app = express();

app.use(bodyParser.json());
app.use(
  cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey]
  })
)

app.use(passport.initialize());
app.use(passport.session());

require('./routes/authRoutes.js')(app);
require('./routes/billingRoutes.js')(app);
require('./routes/apiRoutes.js')(app);

// Serve up static assets (usually on heroku)
if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));
}

// Send every request to the React app
// Define any API routes before this runs
app.get("*", function (req, res) {
  res.sendFile(path.join(__dirname, "./client/build/index.html"));
});

app.listen(PORT, function () {
  console.log(`🌎 ==> API server now on port ${PORT}!`);
});
  • 配置/密钥.js
if (process.env.NODE_ENV === 'production') {
    // Production
    module.exports = require('./prod');
} else {
    // Development
    module.exports = require('./dev');
}
  • 配置/生产js
const dotenv = require('dotenv');
dotenv.config();

module.exports = {
  googleClientID: process.env.GOOGLE_CLIENT_ID,
  googleClientSecret: process.env.GOOGLE_CLIENT_SECRET,
  mongoURI: process.env.MONGODB_URI,
  cookieKey: process.env.COOKIE_KEY,
  stripePublishableKey: process.env.STRIPE_PUBLISHABLE_KEY,
  stripeSecretKey: process.env.STRIPE_SECRET_KEY
}
  • 配置/开发.js
const dotenv = require('dotenv');
dotenv.config();

module.exports = {
  googleClientID: process.env.GOOGLE_CLIENT_ID,
  googleClientSecret: process.env.GOOGLE_CLIENT_SECRET,
  mongoURI: process.env.MONGODB_URI,
  cookieKey: process.env.COOKIE_KEY,
  stripePublishableKey: process.env.STRIPE_PUBLISHABLE_KEY,
  stripeSecretKey: process.env.STRIPE_SECRET_KEY
}
  • .环境
GOOGLE_CLIENT_ID=some key
GOOGLE_CLIENT_SECRET=some key
MONGODB_URI=some key
COOKIE_KEY=some key
huus2vyu

huus2vyu1#

好吧,我自己也刚发现哪里出了问题,我想我应该和有同样问题的人分享一下。
我的代码都是正确的,除了Heroku不承认。env和保存在。env文件中的所有秘密不会被Heroku挑选,我不知道。
解决方案只需进入“设置”(在Heroku Jmeter 板中)-〉配置变量-〉单击“显示配置变量”-〉添加机密的“密钥”和“值”(例如密钥:谷歌客户ID,值:“您的API密钥”),然后单击“添加”
您可以根据需要添加多个键、值对。

dtcbnfnu

dtcbnfnu2#

如果您在mongo db中遇到“函数调用超时,504网关超时”的错误,这个问题可能是由于mongo atlas无法从任何地方访问IP。您可以执行以下操作来解决它:-
1 -登录到您的mongo db atlas并转到您的集群。
2 -导航至“安全”-〉“网络访问”。[1]:https://i.stack.imgur.com/SznTo.png此图像可能对您有所帮助。
3 -点击页面上的“编辑”按钮,将IP设置为“允许从任何地方访问”。确保它是(0. 0. 0. 0/0)。
=〉这可能会解决Mongo DB中的504网关超时错误。

相关问题