2014-08-28 4 views
0

Express.js 웹 앱이 있습니다. 주 app.js 파일에서 I require()은 제 3 자 종속성의 묶음입니다. 최근에 내 app.js 코드의 일부를 별도의 모듈로 추출하기 시작했습니다. 내 모듈 내부노드 모듈에서 객체 참조를 사용 가능하게 만드는 방법은 무엇입니까?

// in app.js 
var users = require('./modules/users'); 

// and then e.g. 
// users.add(doc); 

, 나는 가끔 내 주요 app.js 파일에서 사용할 수있는 객체를 사용할 필요가 그리고 내 모듈에 그 객체에 대한 참조를 전달하는 가장 좋은 방법은 무엇 궁금하네요.

내 현재의 접근 방식 :

// in app.js 

// pass needed object references in initialization step 
users.init([db, logger]); 

// in modules/users.js 

var db, logger; 

exports.init = function (deps) { 
    db = deps[0]; 
    logger = deps[1]; 
}; 

이 방법은 의미가 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

2

물론 모듈을 사용하십시오. :)

// db.js 

// create db instance here rather than in app.js 

module.exports = db; 

그리고

// logger.js 

// create logger instance here rather than in app.js 

module.exports = logger; 

다음

// app.js 

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

그리고

// lib/somewhere.js 

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

당신이보다는 CommonJS 의존성 주입 시스템에 의존 할 수있어이 방법 너의 의존성 주사를 모두하는거야. 엘프 (require 대신에 참조를 전달하여 모듈을 작성하십시오).

예상대로 작동하는 이유는 모듈이 한 번만 해석되므로 팩토리 함수를 사용하는 것과 달리 모든 것을 인스턴스화하면 작동합니다.

+0

한 번만 해석 하시겠습니까? 거룩한 암소, 그것은 모두 의미가 있습니다 :) 어떻게 든 나는 각각의'require()'가 모듈의 새로운 인스턴스를 생성한다고 생각했습니다. –

+0

아마 모든 것을 이해하기 위해서 db 모듈은 db 연결 인스턴스의 Promise를 정의해야합니다. 그렇지 않으면 연결이 아직 준비되지 않았고 db conn을 사용하는 각 모듈이 Promise를 해결해야하기 때문입니다. –

1

당신은 정상으로 require 모듈 수 있어야한다 :

// users.js 
var db = require('./db'); 
exports.init = function() { 
    // use db in here 
}; 

그러나 때로는이 불가능하며 명시 적으로 모듈에 합격해야합니다. , 나는 그것이 당신과 같은 몇 가지 초기화 방법에 대한보다 필요에 종속성을 전달하는 청소기라고 생각

// users.js 
module.exports = function(db, logger) { 
    return { 
     init: function() { /* use db and logger in here */} 
    }; 
} 

// app.js 
var db = ...; 
var logger = ...; 
var users = require('./users')(db, logger); 
users.init(); 

이 내가 개인적으로 선호하는 패턴 : 그것을 할 수 한 가지 방법은 require 모듈이 때 의존성에 전달하는 것입니다 당신의 모범을 보았습니다.

당신이 우리가 다른 파일에있는 모든 경로를 가지고 필요로 할 때 꽤 많은, 예를 들어 주위에 우리 app 인스턴스를 전달하는 ExpressJS 코드에서 수행 볼 수

: 당신이 뭔가를해야 할 경우

require('./routes')(app); 
+0

그래, 그 패턴이 좋아 보인다. 따라서 전체 users.js 모듈은 하나의 큰 함수 범위이며 외부 참조는 해당 범위의 인수로 사용할 수 있습니다. –

1

하는 것으로 app.js에 특별히 초기화 오히려 자신의 모듈보다 당신은 app.js에서 내보낼 수 있습니다 다음 app.js 필요합니다 다음

// app.js 
var db = require("db"), 
    logger = require("logger"); 

// do your initialization with db and logger 
module.exports = { db: db, logger: logger }; 

과 :

0123을
// users.js 
var db = require("./app").db, 
    logger = require("./app").logger; 

// use db and logger 

@Nico에서 언급했듯이 모듈은 한 번 해석되고 app.js은 다른 곳에서 필요할 때마다 해석되지 않기 때문에 효과가 있습니다.

+0

흥미로운 패턴. –

관련 문제