2012-11-01 4 views
1

노드 콜백에서 할당을 올바르게 처리하는 방법을 이해하는 데 문제가 있습니다. 나는 설정 파일을 읽고 그것을 .xaml을 파싱하기 위해 props를 사용하는 익스프레스 앱의 값으로 설정하고있다. 내가 시도했을 때 분명히 내가 app.get 수없는 이러한 값을 설정했습니다 사용하십시오. (cfg_decoder는 props 모듈에서 필요합니다). console.log()는 콜백에서 제대로 작동하지만 콜백 외부에서 app.get을 처리하거나 값이 설정된 시점을 어떻게 알 수 있습니까?node.js 타이밍 문제가 발생했습니다.

app = express() 

fs.readFile('./config.yaml', function (err,data) { 
    if (err) { 
    return console.log(err); 
    } 

    cfg = cfg_decoder(data); 
    app.set('title', cfg['title']) 
    app.set('port', cfg['port']) 

    console.log(app.get('title')) 

}); 

참고로 구성 옵션을 설정하는 좋은 방법입니까?

+0

구성 옵션을 관리하는 좋은 방법입니다. 문제는 외부의 콜백에 설정된 값을 가져올 수 없다는 것입니다. – Federico

답변

1

익스프레스 오브젝트가 인스턴스화되어있는 한 모든 범위 내에서 app.get() 메소드를 사용할 수 있어야합니다.

fs.readFile() 함수가 설정 값을 반환 한 다음 app.set()을 읽기 함수 범위 밖에서 수행하도록 할 수 있습니다. 내 응용 프로그램의

function read(file){ 
    var content; 
    fs.readFileSync(file, function (err, data) { 
     if (err) return console.log(err); 
     content = cfg_decoder(data); 
    }); 
    return content; 
} 

var config = read('./config.yaml'); 
app.set('title', cfg['title']) 
app.set('port', cfg['port']) 

은 내가 config.js 파일을 사용하거나 당신은 config.json 파일을 (쉬울 것이다) 사용할 수 있습니다. 내 .js 파일에서 나는 단지 객체 배열 선언을 가지고 있으며 그 객체를 내보낼 수 있습니다.

Config.js :

var config = { 
    host: '127.0.0.1', 
    port: '8000', 
    title: 'Title', 
    /* etc */ 
}; 
module.exports = config; 

App.js는 :

var config = require('./config'), 
    express = require('express'), 
    app = express(); 

app.set('title', config.title); 
app.listen(config.port, config.host); 

난이 도움이되기를 바랍니다.

+0

와우 이것은 일을하는 훨씬 더 좋은 방법입니다. 왜냐하면 나는 그것이 가장 깨끗하다고 ​​느꼈기 때문에 yaml을 사용하고 있었지만이 방법은 훨씬 쉽습니다. 이것은 또한 훨씬 깨끗한 코드입니다, 감사합니다. – ubiQ

+1

'fs.readFile'의 동기 버전을 사용하지 않으면 예제가 작동하지 않습니다; 적어도 하나의 이벤트 루프를 돌아 다니지 않고 (당신의 코드가 허용하지 않는)'read()'의 반환 값은'undefined'가 될 것입니다. 이 특별한 경우에는'fs.readFileSync'를 사용하는 것이 실제로 합리적입니다. 설정 파일이 읽혀지기 전까지는 다른 일을 할 수 없기 때문입니다. 그러나 패턴은 일반화 할 수 없습니다. – ebohlman

+0

동기 버전을 적어두고 업데이트 한 것은 아닙니다. – joelretdev

관련 문제