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)