2012-11-01 43 views
1

我无法理解如何正确处理节点回调中的分配。我正在阅读一个配置文件,并使用道具来解析.yaml,并在快速应用中设置它的值。当我尝试和使用我明显设置的我不能app.get这些值。 (从道具模块需要cfg_decoder)。 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