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
中间件应该如何处理查询。