【问题标题】:ReferenceError for Heroku MongoLab ConnectHeroku MongoLab Connect 的参考错误
【发布时间】:2014-04-02 07:30:17
【问题描述】:

我非常接近在 Heroku 上的沙盒环境中使用 MongoDB 插件运行的快速应用程序......

我仍然在日志中看到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 上启动此应用?

【问题讨论】:

    标签: node.js mongodb heroku express mlab


    【解决方案1】:

    您的第一个示例看起来接近工作,但有一个问题。 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);
    

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

    【讨论】:

    • 嗯,进步.. 非常感谢.. 在回调中移动 var testColl = db.collection('test'); 使其成为本地,但导致不同的 ReferenceError.. 整个应用程序将如何访问 testColl 变量?
    • 我用一些想法编辑了我的答案。它不适合作为评论。
    猜你喜欢
    • 2019-02-07
    • 2021-03-26
    • 2017-12-07
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2016-05-11
    • 2011-12-03
    • 2015-05-07
    相关资源
    最近更新 更多