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

Posted

技术标签:

【中文标题】Node.js + MongoDB 全局变量和作用域【英文标题】:Node.js + MongoDB global variable and scope 【发布时间】:2016-10-11 23:29:05 【问题描述】:

我正在尝试与我的 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", 全局.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】:

这实际上只是一个执行顺序问题。 MongoClient.connect(...) 调用是异步的。在建立连接之前,不会调用您传递的回调函数。但是,您最后拥有的console.log(global.db) 会立即被调用,调用您的回调之前。

您实际上不需要在此处显式设置db 全局。在模块外部范围内定义的变量在模块的全局范围内。将值附加到global 使其可以跨模块使用,但是在模块之间公开值的更好方法是将它们附加到exports,以便可以在需要时显式导入它们。如果您只在此模块中使用db,则没有必要。

【讨论】:

我明白了,这很有意义!我确实在使用不同的模块,例如我将使用 db 变量的路由模块。我会读到export。非常感谢。 :-)

以上是关于Node.js + MongoDB 全局变量和作用域的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 全局对象

Node.js——HTTP作用域上下文

Node.js 全局变量

06慕课网《进击Node.js基础》作用域和上下文

Node.js概述及编程基础

[Node.js, MongoDB/Mongoose]:使用 indexOf 生成唯一的标签列表非常慢