Heroku MongoLab Connect的ReferenceError

时间:2014-03-01 03:23:40

标签: node.js mongodb heroku express mlab

我非常接近使用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上启动此应用程序?

1 个答案:

答案 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);

肯定有办法改进,但它应该让你开始。