Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止

Posted

技术标签:

【中文标题】Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止【英文标题】:Mongodb atlas + node.js working locally but stop when pushed to Heroku 【发布时间】:2019-08-19 19:19:17 【问题描述】:

我在我的 node.js 网站中创建了一个帖子路由,允许用户申请工作。它在本地运行良好并连接到 mongodb atlas 但是当我将应用程序推送到 Heroku 并尝试提交工作申请表时,我的网站超时。我对此很陌生,不知道该怎么做。谢谢

这是我的代码

var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var Applicant = require('./models/applicants');
var sendAppliedEmail = require('./mail/index.js');

var app = express();
app.set('view engine', 'ejs');
app.use(express.static(__dirname + "/public"));
app.use(express.static(__dirname + '/js'));
var port = process.env.PORT || 3000;

mongoose.connect('mongodb+srv://klaurtar:************@cluster0-nakj7.mongodb.net/test?retryWrites=true', useNewUrlParser: true);
app.use(bodyParser.urlencoded(extended: true));

这是我运行 heroku 日志时的终端

【问题讨论】:

Please don't post screenshots of text。它们无法被搜索或复制,并且可用性差。相反,将代码作为文本直接粘贴到您的问题中。如果选择它并单击 按钮或Ctrl+K,则代码块将缩进四个空格,这将导致其呈现为代码。 您希望我以纯文本形式发布日志吗? 我看到 MongoNetworkError 正在发生,如果事情在本地运行良好,但在 heroku 上却没有,那么 IP 白名单可能是问题所在。在我们进行任何连接之前,需要在 MongoDB Atlas 中将 IP 列入白名单。如果你不知道IP(heroku),你可以把它写成0.0.0.0/0 如果以下答案(IP 白名单)解决了您的问题,请接受它作为正确答案。这也会对其他人有所帮助。谢谢。 【参考方案1】:

您的 MongoDB 是在 GCP 还是 Azure 上运行?如果是这样,他们需要一个 0.0.0.0/0 的 IP 白名单,然后在您的 Heroku 浏览器控制台上重新启动所有 Dynos(它位于右上角的更多下拉菜单中)。

这些文章很有帮助: https://docs.atlas.mongodb.com/security-whitelist/

.17 上:https://cloud.google.com/community/tutorials/mongodb-atlas-appengineflex-nodejs-app

【讨论】:

【参考方案2】:

当我尝试从 mlab 迁移到 Atlas MangoDb 时,我遇到了同样的问题。所以我找到的解决方案是在你的 Heroku 应用程序中添加配置变量。

    点击设置转到您的 Heroku 应用程序 点击显示配置变量 添加一个新的 KEY:MONGODB_URL 添加一个新值:您的连接字符串 刷新您的 Heruko 应用程序,一切顺利。

PS:确保您的 dbconnection 正常工作。如果有问题,我会留下我的联系进行比较:

  mongoCFG = 
    useNewUrlParser: true,
    ssl: true,
    replicaSet: '<clusterName>-shard-0',
    authSource: 'admin',
    retryWrites: true,
    useUnifiedTopology: true,
  

console.log('Attempting to connect to mongoose');
mongoose.connect(config.mongoURL, mongoCFG)
  .then(() => 
    console.log("Connected to Mongo database!");
  )
  .catch(err => 
    console.error("App starting error:", err.stack);
  );```

【讨论】:

【参考方案3】:

我使用 mongodb atlas 将我的 IP 列入白名单并更新了我的代码以将 uri 保存为变量,它现在可以在 Heroku 生产中使用。这是我最终工作的代码。

var uri = "mongodb+srv://klaurtar:************@cluster0-nakj7.mongodb.net/test?

retryWrites=true";


mongoose.connect(uri, useNewUrlParser: true);
var db = mongoose.connection;

【讨论】:

【参考方案4】:

我看到 MongoNetworkError 正在发生,如果事情在本地运行良好,但在 Heroku 却没有,那么 IP 白名单可能是问题所在。在我们进行任何连接之前,需要在 MongoDB Atlas 中将 IP 列入白名单。如果你不知道IP(heroku),你可以把它写成0.0.0.0/0

我过去遇到过类似的问题,这对我有用。

【讨论】:

以上是关于Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止

我无法将数据存储到 Postman 上的 MongoDB(Atlas)中(Node.js with express)

将 Nowjs 托管的 Node.js 服务器连接到 MongoDB Atlas DB

连接到 MongoDB Atlas Cluster 错误

将 Heroku App 连接到 Atlas MongoDB 云服务

将 Heroku App 连接到 Atlas MongoDB 云服务