복붙노트

[MONGODB] 어떻게 Node.js를 웹 응용 프로그램에서 MongoDB의 연결을 관리합니까?

MONGODB

어떻게 Node.js를 웹 응용 프로그램에서 MongoDB의 연결을 관리합니까?

나는 웹 사이트를 작성하는 MongoDB를 사용하여 노드 MongoDB의 네이티브 드라이버를 사용하고 있습니다.

나는 연결을 관리하는 방법에 대한 몇 가지 질문이있다 :

해결법

  1. ==============================

    1.노드 MongoDB를 모국어로 차 커미터는 말합니다 :

    노드 MongoDB를 모국어로 차 커미터는 말합니다 :

    그래서, 직접 귀하의 질문에 대답하기 위해, 그 결과 MongoClient.connect에서 ()는 DB 객체를 다시 사용합니다. 이것은 당신이 풀링, 각 DB 액션에 개방 / 폐쇄 연결에 비해 눈에 띄게 속도 증가를 제공 할 수 있습니다.

  2. ==============================

    2.때 Node.js를 응용 프로그램이 시작 새 연결을 열고 기존 DB 연결 개체를 재사용 :

    때 Node.js를 응용 프로그램이 시작 새 연결을 열고 기존 DB 연결 개체를 재사용 :

    import express from 'express';
    import Promise from 'bluebird';
    import logger from 'winston';
    import { MongoClient } from 'mongodb';
    import config from './config';
    import usersRestApi from './api/users';
    
    const app = express();
    
    app.use('/api/users', usersRestApi);
    
    app.get('/', (req, res) => {
      res.send('Hello World');
    });
    
    // Create a MongoDB connection pool and start the application
    // after the database connection is ready
    MongoClient.connect(config.database.url, { promiseLibrary: Promise }, (err, db) => {
      if (err) {
        logger.warn(`Failed to connect to the database. ${err.stack}`);
      }
      app.locals.db = db;
      app.listen(config.port, () => {
        logger.info(`Node.js app is listening at http://localhost:${config.port}`);
      });
    });
    
    import { Router } from 'express';
    import { ObjectID } from 'mongodb';
    
    const router = new Router();
    
    router.get('/:id', async (req, res, next) => {
      try {
        const db = req.app.locals.db;
        const id = new ObjectID(req.params.id);
        const user = await db.collection('user').findOne({ _id: id }, {
          email: 1,
          firstName: 1,
          lastName: 1
        });
    
        if (user) {
          user.id = req.params.id;
          res.send(user);
        } else {
          res.sendStatus(404);
        }
      } catch (err) {
        next(err);
      }
    });
    
    export default router;
    
  3. ==============================

    3.여기 MongoDB의 연결을 관리하는 몇 가지 코드입니다.

    여기 MongoDB의 연결을 관리하는 몇 가지 코드입니다.

    var MongoClient = require('mongodb').MongoClient;
    var url = require("../config.json")["MongoDBURL"]
    
    var option = {
      db:{
        numberOfRetries : 5
      },
      server: {
        auto_reconnect: true,
        poolSize : 40,
        socketOptions: {
            connectTimeoutMS: 500
        }
      },
      replSet: {},
      mongos: {}
    };
    
    function MongoPool(){}
    
    var p_db;
    
    function initPool(cb){
      MongoClient.connect(url, option, function(err, db) {
        if (err) throw err;
    
        p_db = db;
        if(cb && typeof(cb) == 'function')
            cb(p_db);
      });
      return MongoPool;
    }
    
    MongoPool.initPool = initPool;
    
    function getInstance(cb){
      if(!p_db){
        initPool(cb)
      }
      else{
        if(cb && typeof(cb) == 'function')
          cb(p_db);
      }
    }
    MongoPool.getInstance = getInstance;
    
    module.exports = MongoPool;
    

    서버를 시작하면 initPool 전화

    require("mongo-pool").initPool();
    

    그런 다음 다른 모듈에서 다음을 수행 할 수 있습니다 :

    var MongoPool = require("mongo-pool");
    MongoPool.getInstance(function (db){
        // Query your MongoDB database.
    });
    

    이것은 MongoDB의 문서를 기반으로합니다. 그것을 살펴 보자.

  4. ==============================

    4.단일 자체에 몽고 연결 풀 관리 모듈이 포함되어 있습니다. 이 방법은 두 가지 이점을 제공합니다. 첫째로 그것은 당신의 코드 모듈 및 테스트에보다 쉽게 ​​유지합니다. 둘째 당신은 데이터베이스 연결 객체의 장소가 아니다 요청 객체 데이터베이스 연결을 혼합 할 수 밖에 없습니다. (이것은 매우 위험한 라이브러리 코드에 의해 구성된 객체에 아무것도 혼합 간주하는 자바 스크립트 I의 성격을 감안할 때). 그래서 당신은 단지 수출 두 가지 방법이 모듈을 고려 할 필요가와. 연결 = () => 약속 얻을 = () => dbConnectionObject.

    단일 자체에 몽고 연결 풀 관리 모듈이 포함되어 있습니다. 이 방법은 두 가지 이점을 제공합니다. 첫째로 그것은 당신의 코드 모듈 및 테스트에보다 쉽게 ​​유지합니다. 둘째 당신은 데이터베이스 연결 객체의 장소가 아니다 요청 객체 데이터베이스 연결을 혼합 할 수 밖에 없습니다. (이것은 매우 위험한 라이브러리 코드에 의해 구성된 객체에 아무것도 혼합 간주하는 자바 스크립트 I의 성격을 감안할 때). 그래서 당신은 단지 수출 두 가지 방법이 모듈을 고려 할 필요가와. 연결 = () => 약속 얻을 = () => dbConnectionObject.

    이러한 모듈을 사용하면 먼저 데이터베이스에 연결할 수 있습니다

    // runs in boot.js or what ever file your application starts with
    const db = require('./myAwesomeDbModule');
    db.connect()
        .then(() => console.log('database connected'))
        .then(() => bootMyApplication())
        .catch((e) => {
            console.error(e);
            // Always hard exit on a database connection error
            process.exit(1);
        });
    

    그것은 DB 연결을 필요로 할 때 비행 앱 단지) (GET 호출 할 수 있습니다합니다.

    const db = require('./myAwesomeDbModule');
    db.get().find(...)... // I have excluded code here to keep the example  simple
    

    다음과 같은 방법으로 DB 모듈을 설정 한 경우뿐만 아니라, 당신은 당신이 데이터베이스 연결을 사용하지 않는 응용 프로그램이 부팅 당신은 또한 당신의 데이터베이스 연결 풀 그 접근의 글로벌 방법이되지 않도록하는 방법이있을 것이다 의지 오류 당신은 연결을 가지고하지 않은 경우.

    // myAwesomeDbModule.js
    let connection = null;
    
    module.exports.connect = () => new Promise((resolve, reject) => {
        MongoClient.connect(url, option, function(err, db) {
            if (err) { reject(err); return; };
            resolve(db);
            connection = db;
        });
    });
    
    module.exports.get = () => {
        if(!connection) {
            throw new Error('Call connect first!');
        }
    
        return connection;
    }
    
  5. ==============================

    5.당신이 Express.js이있는 경우 (허용 대답이 연결을 공유 할 수있는 올바른 방법이다라고 때문에), 당신은 풀없이 캐싱 및 요청 사이의 MongoDB의 연결을 공유하기위한 명시-몽고-DB를 사용할 수 있습니다.

    당신이 Express.js이있는 경우 (허용 대답이 연결을 공유 할 수있는 올바른 방법이다라고 때문에), 당신은 풀없이 캐싱 및 요청 사이의 MongoDB의 연결을 공유하기위한 명시-몽고-DB를 사용할 수 있습니다.

    그렇지 않으면 - 당신은 소스 코드를보고 그것을 다른 프레임 워크를 사용할 수 있습니다.

  6. ==============================

    6.나는 내 응용 프로그램에서 레디 스 연결을 일반 풀을 사용하고있다 - 내가보기 엔 그것을하는 것이 좋습니다. 그것의 일반적이고 당신이 그것을하고 몽고와 어떤 문제가있을 거라 생각하지 않도록 확실히 그것은 MySQL의 작동을 알고

    나는 내 응용 프로그램에서 레디 스 연결을 일반 풀을 사용하고있다 - 내가보기 엔 그것을하는 것이 좋습니다. 그것의 일반적이고 당신이 그것을하고 몽고와 어떤 문제가있을 거라 생각하지 않도록 확실히 그것은 MySQL의 작동을 알고

    https://github.com/coopernurse/node-pool

  7. ==============================

    7.http://mongoosejs.com/docs/api.html

    http://mongoosejs.com/docs/api.html

    몽구스의 소스를 확인하십시오. 그들은 모델 개체가 필요한 경우, 연결이 DB로 만들어 있도록 모델 객체에 연결하고 바인딩을 엽니 다. 드라이버는 연결 풀링을 담당한다.

  8. ==============================

    8.그런 다음 서비스로 연결을 만들 때 필요 재사용한다.

    그런 다음 서비스로 연결을 만들 때 필요 재사용한다.

    // db.service.js
    import { MongoClient } from "mongodb";
    import database from "../config/database";
    
    const dbService = {
      db: undefined,
      connect: callback => {
        MongoClient.connect(database.uri, function(err, data) {
          if (err) {
            MongoClient.close();
            callback(err);
          }
          dbService.db = data;
          console.log("Connected to database");
          callback(null);
        });
      }
    };
    
    export default dbService;
    

    내 App.js 샘플

    // App Start
    dbService.connect(err => {
      if (err) {
        console.log("Error: ", err);
        process.exit(1);
      }
    
      server.listen(config.port, () => {
        console.log(`Api runnning at ${config.port}`);
      });
    });
    

    당신이 원하는 목적지 및 사용

    import dbService from "db.service.js"
    const db = dbService.db
    
  9. ==============================

    9.나는 내 프로젝트에서 최소 연결을 만들 수 있도록 내 코드에서 연결 풀링을 구현하기 위해 내 프로젝트에 코드 아래에 구현 가능한 연결을 다시 한

    나는 내 프로젝트에서 최소 연결을 만들 수 있도록 내 코드에서 연결 풀링을 구현하기 위해 내 프로젝트에 코드 아래에 구현 가능한 연결을 다시 한

    /* Mongo.js*/
    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/yourdatabasename"; 
    var assert = require('assert');
    
    var connection=[];
    // Create the database connection
    establishConnection = function(callback){
    
                    MongoClient.connect(url, { poolSize: 10 },function(err, db) {
                        assert.equal(null, err);
    
                            connection = db
                            if(typeof callback === 'function' && callback())
                                callback(connection)
    
                        }
    
                    )
    
    
    
    }
    
    function getconnection(){
        return connection
    }
    
    module.exports = {
    
        establishConnection:establishConnection,
        getconnection:getconnection
    }
    
    /*app.js*/
    // establish one connection with all other routes will use.
    var db = require('./routes/mongo')
    
    db.establishConnection();
    
    //you can also call with callback if you wanna create any collection at starting
    /*
    db.establishConnection(function(conn){
      conn.createCollection("collectionName", function(err, res) {
        if (err) throw err;
        console.log("Collection created!");
      });
    };
    */
    
    // anyother route.js
    
    var db = require('./mongo')
    
    router.get('/', function(req, res, next) {
        var connection = db.getconnection()
        res.send("Hello");
    
    });
    
  10. ==============================

    10.연결 풀링을 구현하는 가장 좋은 방법은 당신이 MongoClient에 의해 한 다음 연락처 데이터베이스에 필요할 때마다 해당 연결 재사용 반환 연결 개체와 DB 이름을 잡고 하나 개의 글로벌 배열 변수를 작성해야합니다.

    연결 풀링을 구현하는 가장 좋은 방법은 당신이 MongoClient에 의해 한 다음 연락처 데이터베이스에 필요할 때마다 해당 연결 재사용 반환 연결 개체와 DB 이름을 잡고 하나 개의 글로벌 배열 변수를 작성해야합니다.

    희망이 도움이 :)

    여기에 connectionService.js 코드는 다음과 같습니다

    var mongo = require('mongoskin');
    var mongodb = require('mongodb');
    var Q = require('q');
    var service = {};
    service.getConnection = getConnection ;
    module.exports = service;
    
    function getConnection(appDB){
        var deferred = Q.defer();
        var connectionDetails=global.dbconnections.find(item=>item.appDB==appDB)
    
        if(connectionDetails){deferred.resolve(connectionDetails.connection);
        }else{createConnection(appDB).then(function(connectionDetails){
                deferred.resolve(connectionDetails);})
        }
        return deferred.promise;
    }
    
    function createConnection(appDB){
        var deferred = Q.defer();
        mongodb.MongoClient.connect(connectionServer + appDB, (err,database)=> 
        {
            if(err) deferred.reject(err.name + ': ' + err.message);
            global.dbconnections.push({appDB: appDB,  connection: database});
            deferred.resolve(database);
        })
         return deferred.promise;
    } 
    
  11. from https://stackoverflow.com/questions/10656574/how-do-i-manage-mongodb-connections-in-a-node-js-web-application by cc-by-sa and MIT license