【问题标题】:How to connect heroku to MongoDB Atlas如何将 Heroku 连接到 MongoDB Atlas
【发布时间】:2021-04-05 16:45:46
【问题描述】:

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

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

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


    【解决方案1】:

    ConfigVar 拼写错误:应该是 MONGODB_URI 而不是 MONGDB_URI

    【讨论】:

      【解决方案2】:

      您可以尝试创建一个 .env 文件

      DB_CONNECT = mongodb+srv://username:password@cluster0.hmd0i.mongodb.net
      

      像这样安装 npm install dotenv 并在 index.js 文件中要求它 https://ibb.co/sKSFhkn

      【讨论】:

        【解决方案3】:

        我想出了答案!我意识到我没有为我的 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% 解决了问题。

        【讨论】:

          猜你喜欢
          • 2020-10-07
          • 2017-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-05
          • 1970-01-01
          相关资源
          最近更新 更多