代码以这种方式设置:
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
答案 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?