(MERN App)所有API调用在Heroku部署上返回504(网关超时),但在本地工作正常



我已经构建了一个MERN堆栈应用程序,它有几个不同的API调用。它在本地按预期工作,但当部署在Heroku上时,它为所有API调用返回504(网关超时(。我在Mongo DB Atlas上查看数据库,配置值已正确添加到Heroku配置变量中,没有拼写错误。(MONGODB_URI和NODE_ENV都=生产(我做错了什么?

*包装

"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}!`);
});

*config/keys.js

if (process.env.NODE_ENV === 'production') {
// Production
module.exports = require('./prod');
} else {
// Development
module.exports = require('./dev');
}

*config/prod.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
} 

*config/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
} 

*.env

GOOGLE_CLIENT_ID=some key
GOOGLE_CLIENT_SECRET=some key
MONGODB_URI=some key
COOKIE_KEY=some key

好的。我只是自己发现了问题所在,我想我会和任何有同样问题的人分享。

我的代码都是正确的,除了Heroku不识别.env,并且保存在.env文件中的所有秘密都不会被Heroku选中,这是我不知道的。

解决方案只需进入"设置"(在Heroku仪表板中(->配置变量->单击"显示配置变量"->添加您的秘密的"密钥"one_answers"值"(例如密钥:GOOGLE_CLIENT_ID,值:"您的API密钥"(,然后单击"添加">

您可以根据需要添加多个键值对。

如果你在mongo db中收到"函数调用超时,504网关超时"的错误,这个问题可能是由于mongo atlas无法从任何地方访问ip。您可以执行以下操作来解决此问题:-

1-登录到您的mongodb图集并转到您的集群。

2-导航到";安全性"->quot;网络接入";。[1] :https://i.stack.imgur.com/SznTo.png此图像可能会对您有所帮助。

3-点击";编辑";按钮,并将ip设置为"0";允许从任何地方访问";。确保它是(0.0.0.0/0(。

=>这可能会解决MongoDB中的504网关超时错误。

最新更新