Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 迅捷js,mongodb:&x201C;引用错误:未定义数据库”;调用函数时_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript 迅捷js,mongodb:&x201C;引用错误:未定义数据库”;调用函数时

Javascript 迅捷js,mongodb:&x201C;引用错误:未定义数据库”;调用函数时,javascript,node.js,mongodb,express,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; //

代码的设置方式如下:

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未定义”。我遇到了一个类似的情况,并认为这可能是一个类似的问题,因为mongodb.connect()是异步调用的,但我无法使其工作:


这里的问题是您没有将
db
传递给函数,因此它是
未定义的

解决方案:

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
,或者进行特定的数据库查询。您可能希望使用Promissions或async/await更好地处理所有异步调用。

它是简单的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);
  });
}

我以前也遇到过同样的问题,我的解决方案不是将db传递给路由函数,而是将
db
变量设置为全局变量

var mongojs = require('mongojs')
global.db = mongojs(<mongodb url>);
var mongojs=require('mongojs'))
global.db=mongojs();
然后
db
变量可以用于代码的任何部分

如果您使用的是express,请将其放在app.js文件中,这样您就再也不用担心db变量了

PS:有些人认为使用global不是一个好的实践,但我认为既然
global
是一个node.js特性,尤其是既然它可以工作,为什么不呢

我尝试了这个,现在没有出现任何错误,但是页面也没有加载,似乎挂在了什么东西上。是否需要从getData()显式返回内容?@ShawnY您不显示将内容发送回用户的位置。我们在这里只讨论了其中一个可能的问题。我怀疑还有其他问题。我建议您做一个关于express应用程序的教程,了解
get
中间件应该如何处理查询。