如何将 heroku 连接到 MongoDB Atlas

How to connect heroku to MongoDB Atlas

我一直在做噩梦,试图将我的 heroku 应用程序连接到 MongoDB Atlas,因为 mLab 现在已作为 Heroku 插件删除。

我遇到的问题是,我似乎无法将我的应用程序连接到我的 Atlas 数据库。

  1. 我在 Atlas 中创建了一个集群。
  2. 将我的集群 IP 地址设置为 0.0.0.0/0
  3. 在 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% 解决了问题。