2012-04-02 4 views
10

ExpressJs를 Node.js와 함께 사용하고 모든 경로를 'routes'폴더에 넣었습니다. 서버에서 ExpressJS 및 별도의 경로 파일간에 변수 전달

, 나는 다음과 같이 내 경로를 정의, 내 DB 연결을 수행

var routes = require('./routes'); 

var db; 
dbconnect = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {}); 
dbconnect.open(function (err, db) { 

    db.authenticate(config.mongo_user, config.mongo_pass, function (err, success) { 
    if (success) { 

     //routes/index.js 
     app.get('/', routes.index); 

     //routes/users.js 
     app.get('/users', routes.users); 

    } 
    }); 
}); 

내가 자바 스크립트 파일이 노선들은 각각 내부의 'DB'개체에 액세스 할 수 있습니다. 이 'app.js'파일에서 index.js 또는 users.js로 어떻게 전달합니까?

감사합니다.

routes.js :

답변

4

한 가지 제안은 db 매개 변수를 허용하는 기능을 통해 경로를 노출하는 것입니다

module.exports = function(db) { 
    return { 
     index: function(req, res, next) { 
      // Funky db get stuff 
     } 
    } 
} 

포장 값이 같은 폐쇄 및 더 많은 기능을 가진 객체를 반환이다 유용한 패턴으로 때로는 "모듈 패턴 공개"라고합니다. 의존성을 명확하게 보여 주므로 유연한 기능적 접근을 사용하면서 손쉽게 테스트 할 수 있습니다 (예 : 모의 db 객체 사용).

+4

단점은 이제 컨트롤러에서 "모듈"을 다시 사용할 때마다 서명에 추가해야하며 일부 컨트롤러에 2가 필요하고 3이 필요하고 1이 5가 필요한 상황이 발생할 수 있습니다. 이제는 가장 큰 공통 분모를 수용해야하는 서명이 있습니다. 더 나은 접근 방식은 느슨하게 연결된 모듈에서 DB 동작을 캡슐화하는 것이라고 생각합니다. –

+2

@ 브래드 하리스 : 그건 분명히 단점입니다. 동일한 시그니처를 유지하는 한 가지 방법은 중요하다고 생각되면 대신 매개 변수가있는 객체를 받아들이는 것입니다 :'{db : db, foo : foo, bar : bar}'. 해결책은 자신의 단점이 있기는하지만 명확한 해결책은 아닙니다. 단위 테스트는 어렵습니다. –

13

데이터베이스 추상화를 자신의 파일/모듈에 작성하면 필요에 따라 require()하여 필요에 따라 코드베이스 전체에서 다시 사용할 수 있습니다. 올바르게 작성하면 다시 작성되지 않으며 예제처럼 응용 프로그램 시작시 한 번 초기화 될 수 있습니다.

//contents of your database.js file 
var database; 

module.exports = { 

    init : function(config, cb) { 
     database = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {}); 
     database.open(function (err, db) { 
      db.authenticate(config.mongo_user, config.mongo_pass, cb); 
     }); 
    }, 

    query : function(params, cb) { 
     database.query(params, cb); 
    } 

}; 

이것은 간단한 예이지만 희망 사항이 있습니다. 컨트롤러 또는 해당 데이터베이스 개체를 필요로하는 파일, 당신은 그냥 ...

var db = require('database'); 

db.init(params, function(err, db) { 
    ... 
}); 


db.query(params, function(err, db) { 
    ... 
}); 

이점은 당신이 지금 단지를 통해 다른 노드 모듈과 같은 응용 프로그램에서 어디서나 사용할 수있는 느슨하게 결합 된 데이터베이스 개체를 가지고 있습니다 require 문.

+2

나는 이것을 좋아한다. 또 다른 유용한 패턴은 응용 프로그램 (또는 응용 프로그램 자원)을 객체로 나타내는 객체를 갖는 것입니다. 예 : require ('./ myapp.js') .db 또는 require ('./ myapp.js') .config – Prestaul