Node.js + MongoDB 全局变量和作用域

4
我正在尝试连接到 MongoDB 并将我得到的响应(数据库)存储在全局变量中,以便在分离的 JS 文件中重新使用它(例如我的路由文件)。我正在按照此文档进行操作:https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#mongoclient-connection-pooling
第一次尝试:
var mongodb = require('mongodb'), MongoClient = mongodb.MongoClient, MongoURL = "我的_mongodb_url:端口/数据库名称", 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的作用域有关,但我不确定。有没有办法让它工作?

1个回答

4
那实际上只是一个执行顺序的问题。 MongoClient.connect(...) 调用是异步的。你传递的回调函数直到连接建立后才会被调用。然而,你在最后使用的 console.log(global.db) 是立即被调用的,这是在你的回调被调用之前。
实际上,在这里你不需要显式地将 db 变量定义为全局变量。模块外部作用域中定义的变量位于模块的全局作用域中。将值附加到 global 使其跨模块可用,但在模块之间公开值的更好方法是将它们附加到 exports 中,以便可以在需要时明确导入它们。如果你仅在此模块中使用 db,则无需这样做。

我明白了,这很有道理!我确实正在使用不同的模块,例如路由模块,我将使用db变量。我会深入研究“export”。非常感谢。 :-) - Senny Kalidien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接