Express js,mongodb:调用函数时“ReferenceError:db未定义”

时间:2016-12-21 07:02:04

标签: javascript node.js mongodb express

代码以这种方式设置:

var express = require('express');
var router = express.Router();
var mongo = require('mongodb').MongoClient;

function getData(){
  db.collection("collection_name").find({}).toArray(function (err, docs) {
      if (err) throw err;
      //doing stuff here
      }

      var dataset = [
          {//doing more stuff here
          }
      ];
  });
}

router.get("/renderChart", function(req, res) {
    mongo.connect(url_monitor, function (err, db) {
        assert.equal(null, err);
        getData(res);
    });
});

当我运行代码并在运行时尝试访问/ renderChart时,我得到“ReferenceError:db is not defined”。我遇到了类似的情况,并认为它可能是一个类似的问题,因为mongodb.connect()被异步调用,但我无法让它工作:

Express js,mongodb: "ReferenceError: db is not defined" when db is mentioned outside post function

3 个答案:

答案 0 :(得分:2)

这里的问题是你没有将db传递给函数,所以它是undefined

解决方案:

function getData(db, res){
  db.collection("collection_name").find({}).toArray(function (err, docs) {
      if (err) throw err;
      //doing stuff here
      }

      var dataset = [
          {//doing more stuff here
          }
      ];
  });
}

router.get("/renderChart", function(req, res) {
    mongo.connect(url_monitor, function (err, db) {
        assert.equal(null, err);
        getData(db, res);
    });
});

您可能还需要在某些时候传递req,或者进行特定的数据库查询。你可能希望使用promises或async / await来更好地处理所有异步调用。

答案 1 :(得分:0)

简单的Javascript。 您在文件中使用了一个未定义的变量db,因此会抛出错误。

你需要做这样的事情。

var findDocuments = function(db, callback) {
  // Get the documents collection 
  var collection = db.collection('documents');
  // Find some documents 
  collection.find({}).toArray(function(err, docs) {
    assert.equal(err, null);
    assert.equal(2, docs.length);
    console.log("Found the following records");
    console.dir(docs);
    callback(docs);
  });
}

答案 2 :(得分:0)

之前我遇到了同样的问题,而不是将db传递给路由功能,我的解决方案是让db变量全局像

var mongojs = require('mongojs')
global.db = mongojs(<mongodb url>);

然后db变量可用于代码的任何部分

如果您正在使用express,请将其放在app.js文件中,您将永远不必担心db变量。

PS:有些人认为使用全局不是一种好的做法,但我认为,因为global是一个node.js功能,特别是因为它有效,为什么不呢? node.js global variables?