我正在尝试与MongoDB建立单一连接,并将响应(数据库)存储在全局变量中,因此我可以在单独的JS文件中重复使用它(就像我的路由的单独文件一样) 。我正在遵循此文档作为示例:https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#mongoclient-connection-pooling。
首先尝试: var mongodb = require('mongodb'), MongoClient = mongodb.MongoClient, MongoURL =“my_mongodb_url:port / database_name”, global.db;
MongoClient.connect(MongoURL, function(err, database) {
db = databse;
console.log(db); // shows stuff
}
console.log(global.db); // shows undefined
经过一些研究后,我找到了解决问题的可能方法:在Node中创建一个带全局前缀的全局变量。但它仍然无法正常工作......
第二次尝试:
var mongodb = require('mongodb'),
MongoClient = mongodb.MongoClient,
MongoURL = "my_mongodb_url:port/database_name",
global.db;
MongoClient.connect(MongoURL, function(err, database) {
global.db = databse;
console.log(db); // shows stuff
}
console.log(global.db); // shows undefined
上面的代码都放在同一个文件[app.js]中。我认为这与MongoClient的范围有关。但我不确定。有没有办法使这项工作?
答案 0 :(得分:4)
这实际上只是一个执行顺序问题。 MongoClient.connect(...)
调用异步。在建立连接之前,不会调用您传递的回调函数。但是,最后调用的console.log(global.db)
会立即调用,之后调用您的回调。
你实际上并不需要在这里明确地使db
全球化。在模块的外部范围中定义的变量位于模块的全局范围内。将值附加到global
使其可以跨模块使用,但是在模块之间公开值的更好方法是将它们附加到exports
,以便可以在需要时显式导入它们。如果您仅在此模块中使用db
,那么这不是必需的。