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