我一直在做噩梦,试图将我的 heroku 应用程序连接到 MongoDB Atlas,因为 mLab 现在已作为 Heroku 插件删除。
我遇到的问题是,我似乎无法将我的应用程序连接到我的 Atlas DB。
- 我在 Atlas 中创建了一个集群。
- 将我的集群 IP 地址设置为
0.0.0.0/0
- 在 Heroku 中更新了我的配置变量。
似乎我的应用在本地运行良好...
为了增加一些复杂性,几年前,我可以在本地运行 mongoose,只需运行 mongod
命令。但是,由于 MacOS Catalina 更新,这似乎已停止工作......我的终端无法 /data/db
目录:
MongoDB can't find data directory after upgrading to Mac OS 10.15 (Catalina)
所以我按照说明创建了一个新的 /data/db
文件夹。这在本地工作,如果我运行:
mongod --dbpath=/Users/reenaverma/MongoData
所以在本地,我可以使用我的应用程序并完全更新数据库。
但是,当我在 PROD/heroku 中访问我的应用程序时,每次我尝试登录或执行 REST/DB 操作(例如获取请求)时,我都会收到 503 错误。所以我知道,我的数据库没有在 PROD/heroku 中连接。
关于我缺少的东西,我的想法已经用完了。
我的 mongo --version
是 MongoDB shell 版本 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}`));
这是我的配置变量在 Heroku 中的外观: