我非常接近使用MongoDB插件在Heroku上的沙盒环境中工作的快速应用程序..
我仍然在日志中看到ReferenceError
,这似乎是应用崩溃的原因。
第一个错误是关于此配置:
//MongoDB
var mongodb = require('mongodb');
var db;
var MONGODB_URI = process.env.MONGOLAB_URI;
var PORT = process.env.PORT;
mongodb.MongoClient.connect(MONGODB_URI, function(err, database) {
if(err) throw err;
db = database;
app.listen(PORT);
console.log('Listening on port ' + PORT);
});
var testColl = db.collection('test');
这导致日志读取TypeError
,可能是因为db
是在本地定义的。
app[web.1]: var testColl = db.collection('test');
app[web.1]: TypeError: Cannot call method 'collection' of undefined
最近的错误是ReferenceError:
app[web.1]: var db = database;
app[web.1]: ReferenceError: database is not defined
可能是因为database
是全局定义的,但未在连接的上下文中引用..
//MongoDB
var MongoClient = require('mongodb').MongoClient,
var Server = require('mongodb').Server;
var mongoUri = process.env.MONGOLAB_URI;
var port = process.env.PORT;
var db = database;
var mongoclient = new MongoClient(new Server(mongoUri,
{ 'native_parser' : true }));
var testColl = db.collection('test');
mongoclient.open(function (err, mongoclient) {
if (err) throw err
app.listen(port);
console.log("Express server started on port " + port);
});
如何重新格式化代码以在Heroku上启动此应用程序?
答案 0 :(得分:0)
你的第一个例子看起来很接近工作,但有一件事是错的。 mongodb.connect
是一个异步调用,这意味着它立即返回。这就是它具有回调参数的原因。因为代码运行得如此之快,所以在尝试使用db
对象之前没有时间实际连接到数据库,这是导致第一组代码崩溃的原因。
如果在回调中移动数据库调用,它应该可以工作。
修改:这是对您评论的回复,但我无法在其他评论中包含太多代码,因此您可以进行修改。
这实际上取决于您的用例,但我意识到这不是很有帮助。所以这是你可以做到的一种方式:
module.exports = function() {
return db;
};
通过这样做,您可以从另一个文件中请求它,并按原样使用它:
var http = require('http');
var db = require('./db.js');
http.createServer(function(req, res) {
db().collection('test', function(err, collection) {
console.log(err, collection);
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('We got it! Unless there is an error...\n');
});
}).listen(8080);
肯定有办法改进,但它应该让你开始。