[MONGODB] 어떻게 Node.js를 웹 응용 프로그램에서 MongoDB의 연결을 관리합니까?
MONGODB어떻게 Node.js를 웹 응용 프로그램에서 MongoDB의 연결을 관리합니까?
나는 웹 사이트를 작성하는 MongoDB를 사용하여 노드 MongoDB의 네이티브 드라이버를 사용하고 있습니다.
나는 연결을 관리하는 방법에 대한 몇 가지 질문이있다 :
해결법
-
==============================
1.노드 MongoDB를 모국어로 차 커미터는 말합니다 :
노드 MongoDB를 모국어로 차 커미터는 말합니다 :
그래서, 직접 귀하의 질문에 대답하기 위해, 그 결과 MongoClient.connect에서 ()는 DB 객체를 다시 사용합니다. 이것은 당신이 풀링, 각 DB 액션에 개방 / 폐쇄 연결에 비해 눈에 띄게 속도 증가를 제공 할 수 있습니다.
-
==============================
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.여기 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.단일 자체에 몽고 연결 풀 관리 모듈이 포함되어 있습니다. 이 방법은 두 가지 이점을 제공합니다. 첫째로 그것은 당신의 코드 모듈 및 테스트에보다 쉽게 유지합니다. 둘째 당신은 데이터베이스 연결 객체의 장소가 아니다 요청 객체 데이터베이스 연결을 혼합 할 수 밖에 없습니다. (이것은 매우 위험한 라이브러리 코드에 의해 구성된 객체에 아무것도 혼합 간주하는 자바 스크립트 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.당신이 Express.js이있는 경우 (허용 대답이 연결을 공유 할 수있는 올바른 방법이다라고 때문에), 당신은 풀없이 캐싱 및 요청 사이의 MongoDB의 연결을 공유하기위한 명시-몽고-DB를 사용할 수 있습니다.
당신이 Express.js이있는 경우 (허용 대답이 연결을 공유 할 수있는 올바른 방법이다라고 때문에), 당신은 풀없이 캐싱 및 요청 사이의 MongoDB의 연결을 공유하기위한 명시-몽고-DB를 사용할 수 있습니다.
그렇지 않으면 - 당신은 소스 코드를보고 그것을 다른 프레임 워크를 사용할 수 있습니다.
-
==============================
6.나는 내 응용 프로그램에서 레디 스 연결을 일반 풀을 사용하고있다 - 내가보기 엔 그것을하는 것이 좋습니다. 그것의 일반적이고 당신이 그것을하고 몽고와 어떤 문제가있을 거라 생각하지 않도록 확실히 그것은 MySQL의 작동을 알고
나는 내 응용 프로그램에서 레디 스 연결을 일반 풀을 사용하고있다 - 내가보기 엔 그것을하는 것이 좋습니다. 그것의 일반적이고 당신이 그것을하고 몽고와 어떤 문제가있을 거라 생각하지 않도록 확실히 그것은 MySQL의 작동을 알고
https://github.com/coopernurse/node-pool
-
==============================
7.http://mongoosejs.com/docs/api.html
http://mongoosejs.com/docs/api.html
몽구스의 소스를 확인하십시오. 그들은 모델 개체가 필요한 경우, 연결이 DB로 만들어 있도록 모델 객체에 연결하고 바인딩을 엽니 다. 드라이버는 연결 풀링을 담당한다.
-
==============================
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.나는 내 프로젝트에서 최소 연결을 만들 수 있도록 내 코드에서 연결 풀링을 구현하기 위해 내 프로젝트에 코드 아래에 구현 가능한 연결을 다시 한
나는 내 프로젝트에서 최소 연결을 만들 수 있도록 내 코드에서 연결 풀링을 구현하기 위해 내 프로젝트에 코드 아래에 구현 가능한 연결을 다시 한
/* 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.연결 풀링을 구현하는 가장 좋은 방법은 당신이 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; }
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
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽구스 통해 몽고 배열 푸시 상품 (0) | 2019.11.29 |
---|---|
[MONGODB] 여러 필드 MongoDB에 의해 기 값 (0) | 2019.11.29 |
[MONGODB] 더 정렬 순서가 지정되지 않은 경우 어떻게 MongoDB를 정렬 기록을합니까? (0) | 2019.11.29 |
[MONGODB] 방법 MongoDB를 가진 하위 필터링 배열 [중복] (0) | 2019.11.29 |
[MONGODB] MongoDB를 - 업데이트 문서의 배열에 객체 (중첩 된 업데이트) (0) | 2019.11.29 |