Heroku + MongoLab 插件与 Node.js 应用程序的连接错误 - 错误:连接 ECONNREFUSED 127.0.0.1:27017

Posted

技术标签:

【中文标题】Heroku + MongoLab 插件与 Node.js 应用程序的连接错误 - 错误:连接 ECONNREFUSED 127.0.0.1:27017【英文标题】:Connection error on Heroku + MongoLab addon with Node.js app - Error: connect ECONNREFUSED 127.0.0.1:27017 【发布时间】:2016-03-02 05:29:47 【问题描述】:

当尝试使用 MongoLab 插件启动 Heroku 上托管的 Node.js 应用程序时, 连接到 MongoDB 时,我在 Heroku 日志上收到以下错误。尽管我已经设置了 heroku 环境变量,但它似乎正在尝试连接到本地 mongo。

我的全部代码都在 GitHub 上:https://github.com/yhagio/meetup_planner

My gist for this issue

Heroku 日志

2015-11-28T22:22:58.460531+00:00 heroku[web.1]: Starting process with command `node server.js`
2015-11-28T22:22:59.353911+00:00 app[web.1]: Server started at port number:  38701
2015-11-28T22:22:59.303795+00:00 app[web.1]: Connecting to DB :  mongodb://USERNAME:PASSWORD@ds059804.mongolab.com:59804/heroku_tb6frdh6
2015-11-28T22:22:59.371719+00:00 app[web.1]:
2015-11-28T22:22:59.371723+00:00 app[web.1]: /app/node_modules/mongodb/lib/server.js:235
2015-11-28T22:22:59.371725+00:00 app[web.1]:         process.nextTick(function()  throw err; )
2015-11-28T22:22:59.371725+00:00 app[web.1]:                                       ^
2015-11-28T22:22:59.371729+00:00 app[web.1]: Error: connect ECONNREFUSED 127.0.0.1:27017
2015-11-28T22:22:59.371730+00:00 app[web.1]:     at Object.exports._errnoException (util.js:860:11)
2015-11-28T22:22:59.371731+00:00 app[web.1]:     at exports._exceptionWithHostPort (util.js:883:20)
2015-11-28T22:22:59.371732+00:00 app[web.1]:     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1063:14)
2015-11-28T22:23:00.052255+00:00 heroku[web.1]: Process exited with status 1
2015-11-28T22:23:00.880672+00:00 app[web.1]: Connecting to DB :  mongodb://USERNAME:PASSWORD@ds059804.mongolab.com:59804/heroku_tb6frdh6
2015-11-28T22:23:00.939388+00:00 app[web.1]:
2015-11-28T22:23:00.939392+00:00 app[web.1]: /app/node_modules/mongodb/lib/server.js:235
2015-11-28T22:23:00.939393+00:00 app[web.1]:         process.nextTick(function()  throw err; )
2015-11-28T22:23:00.939397+00:00 app[web.1]: Error: connect ECONNREFUSED 127.0.0.1:27017
2015-11-28T22:23:00.939394+00:00 app[web.1]:                                       ^
2015-11-28T22:23:00.939398+00:00 app[web.1]:     at Object.exports._errnoException (util.js:860:11)
2015-11-28T22:23:00.939399+00:00 app[web.1]:     at exports._exceptionWithHostPort (util.js:883:20)
2015-11-28T22:23:00.939400+00:00 app[web.1]:     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1063:14)
2015-11-28T22:23:00.917276+00:00 app[web.1]: Server started at port number:  42573
2015-11-28T22:23:01.626965+00:00 heroku[web.1]: State changed from starting to crashed
2015-11-28T22:23:01.614846+00:00 heroku[web.1]: Process exited with status 1
2015-11-28T22:23:13.224552+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=warm-retreat-5113.herokuapp.com request_id=54404d8a-7744-49ae-b744-4417abd4b347 fwd="166.62.227.154" dyno= connect= service= status=503 bytes=
2015-11-28T22:23:13.581322+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=warm-retreat-5113.herokuapp.com request_id=063c0fef-8260-46b5-a0f6-b4d546e9a60b fwd="166.62.227.154" dyno= connect= service= status=503 bytes=

这是我连接到 MongoDB 的代码(来自 Heroku 的 MongoLab 插件) server/db_connection.js

var mongoose  = require('mongoose');
var config    = require('../express-config');
var userModel = require('./models/user');
var eventModel = require('./models/event');

function makeDefaultConnection() 
  var uri = process.env.MONGOLAB_URI || '127.0.0.1/meetupplanner';
  console.log('Connecting to DB : ', uri);

  var conn = mongoose.createConnection(uri);

  conn.on('error', function(err)
    console.log('Connection Error ::: ', err);
  );

  conn.model('User', userModel.userSchema);
  conn.model('Event', eventModel.eventSchema);
  return conn;


module.exports.defaultConnection = makeDefaultConnection();

简介

web: node server.js

Server.js

...
var port = process.env.PORT || 3000;
app.listen(port, function() 
  console.log('Server started at port number: ', port);
);

在 Heroku 上添加 MongoLab 插件后,我确认我的 MONGOLAB_URI 已在 Heroku 上设置(设置 > 配置变量)

参考:https://devcenter.heroku.com/articles/mongolab

在 *** 上提出的类似问题:

can't connect to mongolab with node.js on heroku Use Heroku addon mongolab with node.js

请注意,我可以通过以下方式连接到 mongo shell:

$ mongo ds059804.mongolab.com:59804/heroku_tb6frdh6 -u USERNAME -p PASSWORD

我认为凭据很好。

【问题讨论】:

您的配置变量似乎有问题,尽管您声称这是正确的。我认为您还将面临conn.model('User', userModel.userSchema) 的问题,因为我认为模型是 mongoose 上的一种方法,而不是 mongoose.connect 上的方法 @SimonH 抱歉,我将connect 修改为createConnection,它可以在本地工作,但不能在Heroku 上工作。我删除并重新添加了插件,但仍然是同样的问题。因为我可以使用凭据登录到 mongo shell,所以配置似乎很好...... 如果您查看时间戳,我想知道您认为导致问题的代码是否真的是。对 localhost 的引用似乎比连接尝试的 console.log 稍晚 【参考方案1】:

下一步,您为什么不这样做,以确保配置变量能够通过

var uri = process.env.MONGOLAB_URI || config.dbHostName;
console.log('===== Connecting to DB ... =====', uri);
var conn = mongoose.createConnection(uri,...

【讨论】:

更新了代码,但这并没有改变连接错误的任何内容。不过感谢您的建议。 我只能建议在本地运行代码,但要确保它指向 Mongolab 并转向本地 mongo。我想知道是否是其他线路导致了问题 是的,我在本地尝试了相同的 MongoLab,应用程序运行没有问题。由于错误消息显示Error: connect ECONNREFUSED 127.0.0.1:27017,它在 Heroku 上不起作用。我在 Heroku 和 MongoLab 上申请了支持票,所以我会在尝试其他方法时等待。 @Yuichi 您是否收到任何更新或如何解决该问题。我需要你的帮助。【参考方案2】:

我终于想通了。是connect-mongo with session的中间件配置。

在我的配置中是:

app.use(session(
  ...

  // ===== Following 3 lines are trying to connect to local db =====
  store: new MongoStore(    
    'db': 'meetupplanner'
  ),

  // ===== So, I replaced 3 lines above with following =====
  store: new MongoStore(
    url: process.env.MONGOLAB_URI
  ),

  ...

【讨论】:

感谢您发布您的解决方案。我刚遇到这个错误,对我来说它也与 connect-mongo 有关。 哈哈哇。我试图弄清楚这一点,不敢相信我错过了。非常感谢! 嗯,它也对我有用。难以置信。

以上是关于Heroku + MongoLab 插件与 Node.js 应用程序的连接错误 - 错误:连接 ECONNREFUSED 127.0.0.1:27017的主要内容,如果未能解决你的问题,请参考以下文章

如何从 python 使用 mongolab 插件到 Heroku?

如何从 python 使用 mongolab 插件到 Heroku?

如何在 mongoLab 和 Heroku 服务器中使用 mongo URI

在 Heroku 上的 NodeJS 中,MongoDB 与 MongoLab 的连接超时

mongolab和heroku之间的连接需要ssl吗?

无法在 heroku 上使用 node.js 连接到 mongolab