2014-03-01 65 views
0

我非常接近一個明確的應用在在Heroku沙箱環境中使用MongoDB的附加工作..的ReferenceError對Heroku的MongoLab連接

我還在日誌,這似乎是爲理由看到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

你的第一個例子看起來接近工作,但有一件事是錯誤的。 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); 

肯定有辦法改善後那,但它應該讓你開始。

+0

好吧,進步..非常感謝..移動'var testColl = db.collection('test');'回調內部使它本地,雖然,導致不同的ReferenceError ..如何將整個應用程序訪問testColl變量? – StackThis

+0

我用一些想法編輯了我的答案。它不適合作爲評論。 – ZachRabbit