如何将 heroku 连接到 MongoDB Atlas
How to connect heroku to MongoDB Atlas
我一直在做噩梦,试图将我的 heroku 应用程序连接到 MongoDB Atlas,因为 mLab 现在已作为 Heroku 插件删除。
我遇到的问题是,我似乎无法将我的应用程序连接到我的 Atlas 数据库。
- 我在 Atlas 中创建了一个集群。
- 将我的集群 IP 地址设置为
0.0.0.0/0
- 在 Heroku 中更新了我的配置变量。
看来我的应用程序在本地运行良好...
为了增加一些复杂性,几年前,我可以在本地 运行 猫鼬,只需 运行 宁 mongod
命令。然而,这似乎已经停止工作,因为 MacOS Catalina 更新....我的终端无法 /data/db
目录:
所以我按照说明创建了一个新的 /data/db
文件夹。这在本地有效,如果我 运行:
mongod --dbpath=/Users/reenaverma/MongoData
所以在本地,我可以使用我的应用程序并完全更新数据库。
但是,当我在 PROD/heroku 中访问我的应用程序时,每次尝试登录或执行 REST/DB 操作(例如获取请求)时,我都会收到 503 错误。所以我知道,我的数据库未连接 PROD/heroku。
我运行不知道我缺少什么。
我的mongo --version
是MongoDBshell版本v3.6.2.
这是我的 index.js 的样子。任何想法,将不胜感激!!
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
const router = require('./config/router');
const session = require('express-session');
const flash = require('express-flash');
const userAuth = require('./lib/userAuth');
const app = express();
const PORT = process.env.PORT || 8000;
// CONNECT TO THIS DATABASE
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/music-database', { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.set('useCreateIndex', true);
// SET EJS USE
app.set('view engine', 'ejs');
app.set('views', `${__dirname}/views`);
app.use(expressLayouts);
app.use(express.static(`${__dirname}/public`));
// ENSURES FORM DATA IS LISTENED TO AND CAPTURED
app.use(bodyParser.urlencoded({ extended: true }));
app.use(methodOverride(req => {
if(req.body && typeof req.body === 'object' && '_method' in req.body) {
const method = req.body._method;
delete req.body._method;
return method;
}
}));
// SETTING UP SESSION COOKIE
app.use(session({
secret: 'xxxx(', // a random key used to encrypt the session cookie
resave: false,
saveUninitialized: false
}));
// setup flash messages must be AFTER express-session
app.use(flash());
app.use(userAuth);
app.use(router);
// GLOBAL ERROR CATCHER FOR 422 and 500
app.use((err, req, res, next) => {
if(err.name === 'ValidationError') return res.render('pages/422');
res.render('pages/500', { err });
next(err); //display error in terminal/also a callback function
});
// PORT LISTENER - MUST BE AT BOTTOM
app.listen(PORT, () => console.log(`Up and running on port ${PORT}`));
这是我的 Config Vars 在 Heroku 中的样子:
ConfigVar 拼写错误:应该是 MONGODB_URI
而不是 MONGDB_URI
您可以尝试使用
创建一个 .env 文件
DB_CONNECT = mongodb+srv://username:password@cluster0.hmd0i.mongodb.net
安装 npm install dotenv 并像这样在 index.js 文件中要求它
https://ibb.co/sKSFhkn
我找到答案了!我意识到我没有为我的 Config vars 键设置正确的值(我的密码之前没有包含,也没有 ?retryWrites=true&w=majority
)。
如果您通过终端设置 Heroku,您的命令应如下所示:
heroku config:set MONGODB_URI="mongodb+srv://<YOUR_USERNAME>:<YOUR_PASSWORD>@cluster-popuplondon.i2thd.mongodb.net/<YOUR_DATABASE_NAME>?retryWrites=true&w=majority"
并且这 100% 解决了问题。
我一直在做噩梦,试图将我的 heroku 应用程序连接到 MongoDB Atlas,因为 mLab 现在已作为 Heroku 插件删除。
我遇到的问题是,我似乎无法将我的应用程序连接到我的 Atlas 数据库。
- 我在 Atlas 中创建了一个集群。
- 将我的集群 IP 地址设置为
0.0.0.0/0
- 在 Heroku 中更新了我的配置变量。
看来我的应用程序在本地运行良好...
为了增加一些复杂性,几年前,我可以在本地 运行 猫鼬,只需 运行 宁 mongod
命令。然而,这似乎已经停止工作,因为 MacOS Catalina 更新....我的终端无法 /data/db
目录:
所以我按照说明创建了一个新的 /data/db
文件夹。这在本地有效,如果我 运行:
mongod --dbpath=/Users/reenaverma/MongoData
所以在本地,我可以使用我的应用程序并完全更新数据库。
但是,当我在 PROD/heroku 中访问我的应用程序时,每次尝试登录或执行 REST/DB 操作(例如获取请求)时,我都会收到 503 错误。所以我知道,我的数据库未连接 PROD/heroku。
我运行不知道我缺少什么。
我的mongo --version
是MongoDBshell版本v3.6.2.
这是我的 index.js 的样子。任何想法,将不胜感激!!
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
const router = require('./config/router');
const session = require('express-session');
const flash = require('express-flash');
const userAuth = require('./lib/userAuth');
const app = express();
const PORT = process.env.PORT || 8000;
// CONNECT TO THIS DATABASE
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/music-database', { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.set('useCreateIndex', true);
// SET EJS USE
app.set('view engine', 'ejs');
app.set('views', `${__dirname}/views`);
app.use(expressLayouts);
app.use(express.static(`${__dirname}/public`));
// ENSURES FORM DATA IS LISTENED TO AND CAPTURED
app.use(bodyParser.urlencoded({ extended: true }));
app.use(methodOverride(req => {
if(req.body && typeof req.body === 'object' && '_method' in req.body) {
const method = req.body._method;
delete req.body._method;
return method;
}
}));
// SETTING UP SESSION COOKIE
app.use(session({
secret: 'xxxx(', // a random key used to encrypt the session cookie
resave: false,
saveUninitialized: false
}));
// setup flash messages must be AFTER express-session
app.use(flash());
app.use(userAuth);
app.use(router);
// GLOBAL ERROR CATCHER FOR 422 and 500
app.use((err, req, res, next) => {
if(err.name === 'ValidationError') return res.render('pages/422');
res.render('pages/500', { err });
next(err); //display error in terminal/also a callback function
});
// PORT LISTENER - MUST BE AT BOTTOM
app.listen(PORT, () => console.log(`Up and running on port ${PORT}`));
这是我的 Config Vars 在 Heroku 中的样子:
ConfigVar 拼写错误:应该是 MONGODB_URI
而不是 MONGDB_URI
您可以尝试使用
创建一个 .env 文件DB_CONNECT = mongodb+srv://username:password@cluster0.hmd0i.mongodb.net
安装 npm install dotenv 并像这样在 index.js 文件中要求它 https://ibb.co/sKSFhkn
我找到答案了!我意识到我没有为我的 Config vars 键设置正确的值(我的密码之前没有包含,也没有 ?retryWrites=true&w=majority
)。
如果您通过终端设置 Heroku,您的命令应如下所示:
heroku config:set MONGODB_URI="mongodb+srv://<YOUR_USERNAME>:<YOUR_PASSWORD>@cluster-popuplondon.i2thd.mongodb.net/<YOUR_DATABASE_NAME>?retryWrites=true&w=majority"
并且这 100% 解决了问题。