Node.js + MongoDB 全局变量和作用域
Node.js + MongoDB global variable and scope
我正在尝试与我的 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 的范围有关。但我不确定。有没有办法让这个工作?
这实际上只是一个执行顺序问题。 MongoClient.connect(...)
调用是 异步的 。在建立连接之前不会调用您传递的回调函数。但是,您最后的 console.log(global.db)
会立即被调用, 在 您的回调被调用之前。
您实际上不需要在此处显式地使 db
全局化。在模块的外部范围内定义的变量在模块的全局范围内。将值附加到 global
可以跨模块使用,但在模块之间公开值的更好方法是将它们附加到 exports
,以便可以在需要的地方显式导入它们。如果您仅在此模块中使用 db
,则没有必要。
我正在尝试与我的 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 的范围有关。但我不确定。有没有办法让这个工作?
这实际上只是一个执行顺序问题。 MongoClient.connect(...)
调用是 异步的 。在建立连接之前不会调用您传递的回调函数。但是,您最后的 console.log(global.db)
会立即被调用, 在 您的回调被调用之前。
您实际上不需要在此处显式地使 db
全局化。在模块的外部范围内定义的变量在模块的全局范围内。将值附加到 global
可以跨模块使用,但在模块之间公开值的更好方法是将它们附加到 exports
,以便可以在需要的地方显式导入它们。如果您仅在此模块中使用 db
,则没有必要。