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

标签 javascript node.js mongodb global var

我正在尝试与我的 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", 全局数据库;

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,则没有必要。

关于javascript - Node.js + MongoDB 全局变量和作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757674/

相关文章:

javascript - 切换表格的列和行

javascript - SharePoint 2010 和 "get_groups"方法

javascript - 从另一个上下文调用方法时,`this` 未定义

node.js - Mongodb数据库连接代码破坏了应用程序

java - 如何在mongo中插入带有日期的文档?

javascript - 将带有 "static get defaultProps()"的 React 类转换为功能组件

javascript - 修改 MongoDB 以允许跨源请求

javascript - 如何在 node-gyp 构建过程中包含 tesseract 库

mysql - 如何在 TypeORM 中处理 blob 列

mongodb - Sails with Mongo 中的 native 更新不适用于 ObjectId