Heroku上的Node.js Express应用无法使用Mongoose连接到MongoLab数据库

4
我尝试使用Mongoose使我的node.js express应用程序连接到Heroku上的MongoLab数据库。我已经使用app.configure将我的数据库URI设置为MongoLab URI,在production中,并且在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

1
请在您的帖子中包含代码,而不仅仅是链接。 - Jamund Ferguson
当我通过命令行连接时,我收到了相同的错误... mongo -u brad.ross.35 -p Brad1234 ds031347.mongolab.com:31347/heroku_app6861425 但也许你的密码并不是那个。 - Jamund Ferguson
我遇到了同样的问题,但是我得到了这个错误:"错误:数据库名称不能包含字符'。'" 我尝试了很多次,但都没有成功。我现在正在与mongolabs支持团队合作。你联系过他们吗? - Miles
2个回答

3
当传递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退出 - Brad Ross

0

我没有使用过Mongoose,但是在过去与MongoLab连接出现问题时,这是由于连接到数据库和客户端代码之间的竞争条件引起的,而客户端代码则假定了连接。 通常的解决方案是绑定到open事件或提供一个回调函数,在底层驱动程序调用它之前恢复需要连接的启动。 这就是我使用Mongoskin的方式,我从来没有遇到过问题。

希望对你有所帮助 Mike


1
我不太明白。你的意思是在应用程序继续之前执行回调函数吗?这在Node中不太可能,对吧?你能再具体一点并且加上一个例子吗? - Brad Ross
你能展示一下你是如何将初始化代码应用到“open”事件上的吗?我也编辑了我的早期回答。 - SonOfNun
你可能想尝试像我建议的那样绑定到“open”事件。从mongoose文档中并不清楚回调是否像你在app.js中所做的那样被支持,或者参数是否正确。但是,正如我所说,我不是mongoose专家。 - SonOfNun
绑定,比如...在打开事件上回调?我对Node还比较新。 - Brad Ross
是的,抱歉。Nodejs使用'emit/on'来进行事件发布/订阅。其他库使用'bind/trigger'等等... 所以你可以这样做: mongoose.connect myUrl; mongoose.connection.on 'open', initAppFn - SonOfNun
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接