2017-12-13 2 views
0

nodejs의 아키텍처를 어떻게 조합하는지에 대한 기본적인 이해가 부족하여 아래 코드가 문제없이 실행될 수 있다고 생각합니다. 나는 간단한 앱을 배치 할 것이다. 마지막 질문에 도움을 줄 수 있습니까?Express의 지속성 데이터베이스 풀링과 같은 Node의 require() 문제는 어떻게 해결됩니까?

주 : 나는 https://github.com/mysqljs/mysql

node app.js 명령 줄에서 실행되는 MySQL의 패키지를 사용하고 있습니다.

const Express = require("express"); 
const Path = require("path"); 

const app = Express(); 

// Require controller modules 
var book_controller = require('../controllers/bookController'); 
var author_controller = require('../controllers/authorController'); 

router.get('/book', book_controller.books_get); 
router.get('/author', book_controller.authors_get); 

app.listen(5000, function(){ 
    console.log("Server started on port 5000"); 
}); 

bookController 내부 :

var getConnection = require('../config/mysql'); 

// Display list of all books 
exports.book_get = function(req, res) { 
    getConnection(function(err, con) { 
     query = 'SELECT * FROM books'; 
     con.query(query, function(err, result) { 
      if (err) throw err; 
      con.release(); 
      res.render('page/authors', { result:result}); 
     }); 
    })   
}; 

authorController 내부 :

var getConnection = require('../config/mysql'); 

// Display list of all books 
exports.authors_get = function(req, res) {  
    getConnection(function(err, con) { 
     query = 'SELECT * FROM authors'; 
     con.query(query, function(err, result) { 
      if (err) throw err; 
      con.release(); 
      res.render('page/books', { result:result}); 
     }); 
    })  
}; 

내부 app.js 내부

이있다

var mysql = require('mysql');  
var pool = mysql.createPool({ 
    connectionLimit: 100, 
    connectTimeout: 5000, 
    acquireTimeout: 5000, 
    queueLimit: 30, 
    host: 'localhost', 
    user: '', 
    password: '', 
    database: '', 
    multipleStatements: true, 
});  

var getConnection = function(callback) { 
    pool.getConnection(function(err, connection) { 
     if (err) return callback(err); 
     callback(err, connection); 
    }); 
}; 

pool.on('acquire', function(connection) { 
    console.log('Connection %d acquired', connection.threadId); 
}); 
module.exports = getConnection; 

그건 레이아웃입니다. 다음은 질문입니다.

  1. 어떻게 동일한 종속성이 필요한 별도의 파일이 상호 작용합니까? Books와 Author 컨트롤러는 모두 서로 다른 사용자로부터 mysql 풀을 요구하고 액세스해야합니다. MySQL 오브젝트의 새로운 복사본이 인스턴스화 되었습니까?
  2. 풀의 상태가 다음 연결을 유지하는 방법은 무엇입니까?

답변

1

별도로 필요한 파일이 어떻게 상호 작용합니까? Books와 Author 컨트롤러는 모두 서로 다른 사용자로부터 mysql 풀을 요구하고 액세스해야합니다. MySQL 오브젝트의 새로운 복사본이 인스턴스화 되었습니까?

아니오, require을 호출 할 때마다 개체의 새 복사본이 만들어지지 않습니다. 노드에서

은, 필요에 따라 모듈이로드되고 결과 수출 객체는 getConnection에 당신이 require('../config/mysql')를 호출 할 때마다 동일한 참조를 얻을 것이다, 그래서 require에 대한 후속 호출 캐시입니다. module.exports = getConnection; 전의 줄은 모듈이 처음 필요한 경우에만 으로 실행하십시오.

어떻게하면 풀의 상태가 다음 연결을 유지합니까? 내 보낸 getConnection가 캐시되어 있기 때문에

는, 그 함수는 항상 같은 pool 객체를 참조 할 것이다, 그래서 당신의 컨트롤러 모두 동일한 풀에 언급되어있다.