【发布时间】:2021-04-05 16:45:46
【问题描述】:
我一直在做一场噩梦,试图将我的 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}`));
下面是我的 Config Vars 在 Heroku 中的样子:
【问题讨论】:
标签: node.js mongodb heroku mongoose mongodb-atlas