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