使用全局变量在模块之间共享数据库 [英] use global variable to share db between module

查看:68
本文介绍了使用全局变量在模块之间共享数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用'mongodb'模块开发一个nodejs/mongodb应用程序.该应用程序通过以下方式启动

I am working on a nodejs / mongodb app using 'mongodb' module. The app is launched with

node main.js

在main.js中,我连接到db并将连接保留在'db'全局变量中.然后,在服务器"的内部方法中使用"db".我想避免将'db'用作全局变量,但没有找到正确的方法.

In main.js, I connect to the db and keep the connection in the 'db' global variable. 'db' is then used in inner methods of 'server'. I want to avoid having 'db' as a global variable but did not found the correct way to do.

我当前的main.js:

My current main.js:

var server      = require('./lib/server');
var MongoClient = require('mongodb').MongoClient;
var Server      = require('mongodb').Server;
var mongoClient = new MongoClient(new Server(HOST, PORT));
db = null;

// Database connection
mongoClient.open(function(err, mongoClient) {
  if(!err){
    // Database selection
    db = mongoClient.db(DB);

    // Launch web server
    server.start(); // usage of 'db' in this part 

  } else {
    console.log(err.message);
    process.exit(1);
  }
});

有没有更清洁的方式的想法?

Any idea of a cleaner way ?

更新

我终于在connection.js中创建了一个模块:

I finally created a module in connection.js:

var config      = require('../config/config');
var url         = 'mongodb://' + config.db.host + ':' + config.db.port + '/' + config.db.name;
var MongoClient = require('mongodb').MongoClient;
var db          = null;

module.exports = function(cb){
  if(db){
    cb(db);
    return;
  }

  MongoClient.connect(url, function(err, conn) {
    if(err){
      console.log(err.message);
      throw new Error(err);
    } else {
      db = conn; 
      cb(db);
    }
  });
}

每次我都需要建立呼叫连接:

Each time I need to get the connection I call:

var connection = require('./connection');
connection(function(db){
  // doing some stuff with the db
});

这工作得很好.

这种方法有潜在的故障吗?

Any potential failure with this approach ?

推荐答案

我通常会提供一个项目实用程序文件,其中包含许多这样的内容,只是为了简化起见.它起伪全局函数的作用,但是没有全局变量带来的许多常见问题.

I typically include a project utilities file that contains a number of these things, just to make it easy. It functions as a pseudo global, but without many of the usual problems globals entail.

例如,

projectUtils.js

module.exports = {

  initialize: function(next){
    // initialization actions, there can be many of these
    this.initializeDB(next);
  },

  initializeDb: function(next){
    mongoClient.open(function(err, mongoClient) {
      if(err) return next(err);
      module.exports.db = mongoClient.db(DB);
      next();
    });
  }
}

app.js

var projectUtils = require('projectUtils');

// (snip)
projectUtils.initialize(function(err) {
  if(err) throw err; // bad DB initialization
  // After this point and inside any of your routes,
  // projectUtils.db is available for use.
  app.listen(port);
}

通过使用异步initialize()函数,可以确保在启动服务器之前完成所有数据库连接,文件I/O等.

By using an asynchronous initialize() function, you can be sure that all database connections, file I/O, etc., are done before starting up the server.

这篇关于使用全局变量在模块之间共享数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆