【问题标题】:timing issues in node.jsnode.js 中的时间问题
【发布时间】:2012-11-02 23:17:23
【问题描述】:

我无法理解如何正确处理节点回调中的分配。我正在读取配置文件并使用道具在快速应用程序中设置它的值来解析.yaml。当我尝试使用我显然设置的内容时,我无法 app.get 这些值。 (props 模块需要 cfg_decoder)。 console.log() 在回调中正常工作,但是如何在回调之外处理 app.get 或知道何时设置了值?

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'))

});

顺便说一句,这是设置配置选项的好方法吗?

【问题讨论】:

  • 这是管理配置选项的好方法。问题是你无法在它之外获取回调中设置的值?

标签: node.js express


【解决方案1】:

只要 express 对象已被实例化,您就应该能够在任何范围内使用 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);

我希望这会有所帮助。

【讨论】:

  • 哇,这是一种更好的做事方式,我使用 yaml 是因为我觉得它是最干净的,但这种方法要容易得多。这也是更简洁的代码,谢谢。
  • 除非您使用fs.readFile 的同步版本,否则您的示例将无法运行;没有至少一趟事件循环(您的代码不允许),read() 的返回值将是undefined。在这种特殊情况下,使用 fs.readFileSync 实际上是合理的,因为在读取配置文件之前您不能真正做任何其他事情,但该模式不可推广。
  • 谢谢你发现我不是故意写同步版本的,更新了。
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多