【问题标题】:How to load external configuration files in NodeJS dynamically如何在 NodeJS 中动态加载外部配置文件
【发布时间】:2016-06-13 22:51:28
【问题描述】:

在 NodeJS 应用程序中,我想从外部文件动态加载配置数据(要生成的报告)。我可以使用 require('path/config'); 静态加载它们;

但我确实有部分配置需要定期刷新,而且为了使这一切变得更加复杂,这些配置文件包含一个必须可执行的功能。

这样的报告如下所示:

const report = {
  name : 'Report 3',
  description : 'Very simple report.',
  // Some properties
  preprocessor : function() {
  },
  // Some more properties
};

module.exports = report;

当使用 require 重新加载报告时,它基本上不会重新加载。即使我改变了一些东西,它也保持不变。 (原因:require() 使用了缓存,而且这样做是正确的。)

什么是重新加载包含可执行函数的外部配置文件的好方法(可能是外部库)?

【问题讨论】:

  • 为什么不在 report.js 中使用额外的函数来“运行”其他所有内容?然后需要 report.js 并设置一个超时,以按照您想要的任何时间表调用该新函数。

标签: javascript node.js caching


【解决方案1】:

我会使用fs。如果您可以完全控制配置文件(否则很危险),您可以使用eval

var fs = require('fs');

var file = fs.readFileSync(filename);
var module = {}
eval(file);

// You can access report in module.exports

如果您不想阻止您的应用程序(通常推荐),您应该使用the async version 并提供回调。

【讨论】:

  • JSON.parse 很遗憾无法处理可执行的 JavaScript,只能处理 JSON。
  • 抱歉假设。我更新了回复以使用 eval。
  • eval 的问题:它不返回要使用的对象。
  • 我意识到这一点并进行了另一次编辑(很抱歉我没有警告你)。在本地 nodejs 测试中,我能够eval 一段具有典型module.exports 的代码,并且能够通过在eval 之后读取module.exports 来检索const。另一方面,这很难看,您的解决方案要好得多。
【解决方案2】:

为了解决缓存问题,我现在使用库require-without-cache。似乎可以完成这项工作。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多