(MERN 应用程序)所有 API 调用在 Heroku 部署上返回 504(网关超时)但在本地运行良好
(MERN App) All API calls returning 504 (Gateway Timeout) on Heroku deploy yet working fine locally
我构建了一个 MERN 堆栈应用程序,其中有几个不同的 API 调用。它在本地按预期工作,但是当部署在 Heroku 上时,所有 API 调用的 returns 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 提取,这是我不知道的。
解决方案只需进入 'Setting'(在 Heroku 仪表板中)-> Config Vars -> 单击 'Reveal Config Vars' -> 添加 'Key' 和 'Value' 你的秘密(例如键:GOOGLE_CLIENT_ID,值:'your API Key')然后单击 'Add'
您可以根据需要添加多个键值对。
我构建了一个 MERN 堆栈应用程序,其中有几个不同的 API 调用。它在本地按预期工作,但是当部署在 Heroku 上时,所有 API 调用的 returns 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 提取,这是我不知道的。
解决方案只需进入 'Setting'(在 Heroku 仪表板中)-> Config Vars -> 单击 'Reveal Config Vars' -> 添加 'Key' 和 'Value' 你的秘密(例如键:GOOGLE_CLIENT_ID,值:'your API Key')然后单击 'Add'
您可以根据需要添加多个键值对。