繁体   English   中英

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。 在模块的外部范围中定义的变量位于模块的全局范围内。 将值附加到global使其可以跨模块使用,但是在模块之间公开值的更好方法是将它们附加到exports ,以便可以在需要时显式导入它们。 如果您只在此模块中使用db ,那么这不是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM