10

「mongodb」モジュールを使用して、nodejs / mongodb アプリに取り組んでいます。アプリはで起動されます

node main.js

main.js では、db に接続し、接続を「db」グローバル変数に保持します。「db」は「server」の内部メソッドで使用されます。「db」をグローバル変数として使用することは避けたいのですが、正しい方法が見つかりませんでした。

私の現在の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);
  }
});

よりクリーンな方法のアイデアはありますか?

アップデート

最後に、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);
    }
  });
}

私が呼び出す接続を取得する必要があるたびに:

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

これは非常にうまく機能しています。

このアプローチで失敗する可能性はありますか?

4

2 に答える 2

6

簡単にするために、通常、これらの多くを含むプロジェクト ユーティリティ ファイルを含めます。これは疑似グローバルとして機能しますが、グローバルに伴う通常の問題の多くはありません。

例えば、

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 などを確実に実行できます。

于 2013-08-02T03:48:32.003 に答える