Heroku 上的 Node.js Express 应用程序不会使用 Mongoose 连接到 MongoLab 数据库

Posted

技术标签:

【中文标题】Heroku 上的 Node.js Express 应用程序不会使用 Mongoose 连接到 MongoLab 数据库【英文标题】:Node.js Express App on Heroku Won't Connect to MongoLab Database using Mongoose 【发布时间】:2012-08-17 01:57:59 【问题描述】:

我正在尝试让我的 node.js express 应用程序使用 Mongoose 连接到 Heroku 上的 MongoLab 数据库。我使用app.configure 将我的数据库URI 设置为production 上的MongoLab URI,正如您在Heroku 日志中看到的,它肯定将dbURI 设置为MongoLab URI。我肯定将我的NODE_ENV 设置为production。我的问题是什么?

app.js

var express = require('express');
var mongoose = require('mongoose')
  , dbURI = 'localhost';
var app = express();

app.configure('production', function () 
    console.log("production!");
    dbURI = 'mongodb://brad.ross.35:Brad1234@ds031347.mongolab.com:31347/heroku_app6861425';
    console.log(dbURI);
);

mongoose.connect(dbURI, 'test');
mongoose.connection.on('error', console.error.bind(console, 'connection error:'));

var postSchema = new mongoose.Schema(
    body: String
);

var Post = mongoose.model('Post', postSchema);

app.configure(function () 
    //app.use(express.logger());
    app.use(express.bodyParser());
    app.use(express.static(__dirname + '/static'));
);

app.set('views', __dirname + '/views');
app.set('view engine','jade');

app.get('/', function(request, response) 
    response.render('index');
);

app.post('/result', function(request, response) 
    var post = new Post(body: request.body.text);
    post.save(function (err) 
        if (err) 
            console.log("error!");
         else 
            console.log("saved!");
        
    );

    Post.find(function (err, posts) 
        if (!err) 
            console.log("found!");
            console.log(posts);
            response.render('result', posts: posts);
         else 
            console.log("error!");
            response.render('result', posts: []);
        
    );
);

app.get('/result', function (request, response) 
    Post.find(function (err, posts) 
        if (!err) 
            console.log("found!");
            console.log(posts);
            response.render('result', posts: posts);
         else 
            console.log("error!");
            response.render('result', posts: []);
        
    );
);

app.listen(process.env.PORT || 5000);

Heroku 日志

2012-08-21T16:52:21+00:00 heroku[web.1]: State changed from crashed to starting
2012-08-21T16:52:22+00:00 heroku[slugc]: Slug compilation finished
2012-08-21T16:52:23+00:00 heroku[web.1]: Starting process with command `node app.js`
2012-08-21T16:52:24+00:00 app[web.1]: production!
2012-08-21T16:52:24+00:00 app[web.1]: mongodb://brad.ross.35:PASSWORD@ds031347.mongolab.com:31347/heroku_app6861425
2012-08-21T16:52:24+00:00 app[web.1]: connection error: [Error: failed to connect to [ds031347.mongolab.com:31347/heroku_app6861425:27017]]
2012-08-21T16:52:25+00:00 heroku[web.1]: State changed from starting to up

【问题讨论】:

请在您的帖子中包含代码,而不仅仅是链接。 我在通过命令行连接时遇到同样的错误...mongo -u brad.ross.35 -p Brad1234 ds031347.mongolab.com:31347/heroku_app6861425 但也许你的密码不是真的。 我遇到了同样的问题,除了我得到这个错误:“错误:数据库名称不能包含字符'。'”我已经尝试了很多,但没有得到这个工作。我现在正在使用 mongolabs 支持。你联系过他们吗? 【参考方案1】:

传递 URI 时,无需单独传递数据库名称(这会使 mongoose 感到困惑)。

做吧

var uri = 'mongodb://brad.ross.35:Brad1234@ds031347.mongolab.com:31347/heroku_app6861425'
mongoose.connect(uri)

要使用测试数据库,请更改您的 uri:

var uri = 'mongodb://brad.ross.35:Brad1234@ds031347.mongolab.com:31347/test'

【讨论】:

它通过了,但是当我尝试转到 /result 页面时,它只会给我一个“内部服务器错误”并记录以下内容:使用 SIGTERM 2012-08-22T00:27 停止所有进程: 34+00:00 heroku[web.1]:状态从开始变为向上 2012-08-22T00:27:35+00:00 heroku[web.1]:进程以状态 1 退出【参考方案2】:

我没有与 Mongoose 合作过,但是当我过去与 MongoLab 的连接问题时,这是由于连接到假设连接的数据库和客户端代码引起的竞争条件。 通常,解决方案是绑定到open 事件或提供由底层驱动程序调用的回调,然后再恢复需要连接的启动。 这就是我对Mongoskin 所做的事情,我从来没有遇到过问题。

hth 迈克

【讨论】:

我不太明白。您的意思是在应用程序的其余部分继续之前执行回调?在 Node 中这不是真的不可能吗?你能再具体一点,并添加一个例子吗? 你的意思是在mongoose.connect函数的回调中嵌套其他所有内容? 嗨布拉德。我查看了 mongoose 文档,它会在您收到的连接上触发 open 事件。因此,就像您在代码中绑定到“错误”事件一样,您可以绑定到“打开”事件。将您的初始化代码包装在一个函数中并将其传递给您的open 回调。 //app.js var startApp = function() app.configure(...) // 其他初始化任务 mongoose.connection.on 'open', startApp 我试过这样做,它似乎可以工作,但在连接到/result 页面时我仍然得到一个Internal Server Error... 你能展示你是如何将你的初始化代码应用到'open'事件的吗?我也编辑了我之前的答案。

以上是关于Heroku 上的 Node.js Express 应用程序不会使用 Mongoose 连接到 MongoLab 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Heroku cedar 堆栈上的 Node.js 端口问题

Heroku上的Node.js Web Socket H15空闲连接超时

Heroku上的Node.js Web Socket H15空闲连接超时

跨域会话 Cookie(Heroku 上的 Express API + Netlify 上的 React App)

Node.JS、Express 和 Heroku - 如何处理 HTTP 和 HTTPS?

Node.js - 在 Heroku 上使用 MongoHQ 连接到 MongoDB