node.js 导出异步结果怎么处理

  1. 项目要上devops,之前通过配置文件获取项目的配置项,现改为从配置中心拉取配置项,将之前的配置文件同步加载修改为通过接口获取etcd中的配置项,发现无法将异步获取的结果导出?

代码如下:

# 修改前的代码
var baseConfigFilePath      = '../base-config.yaml';  // 基础配置文件路径
var customConfigFilePathEnv = 'CONFIG_PATH';  // 自定义配置文件路径环境变量名

var loadFile = exports.loadFile = function loadFile() {
  var baseConfigFileFullPath = path.join(__dirname, baseConfigFilePath);
  var customConfigFilePath   = process.env[customConfigFilePathEnv];


  var fileData, obj;



  /* 读取基础配置文件 */
  fileData = fs.readFileSync(baseConfigFileFullPath);
  obj = yaml.load(fileData);

   // 使用自定义配置覆盖基础配置
  if (!toolkit.isNullOrWhiteSpace(customConfigFilePath)) {
    var customFileData = fs.readFileSync(customConfigFilePath);
    var customObj = yaml.load(customFileData);
    
    // 覆盖基础配置文件
    toolkit.objUpdate(customObj, obj);
  }

  exports.CONFIG = obj;
};

loadFile();

修改后

var loadFile = exports.loadFile = function loadFile() {
  var baseConfigFileFullPath = path.join(__dirname, baseConfigFilePath);
  var customConfigFilePath   = process.env[customConfigFilePathEnv];

  var fileData, obj;


  /* 读取基础配置文件 */
  fileData = fs.readFileSync(baseConfigFileFullPath);
  obj = yaml.load(fileData);

  // 使用自定义配置覆盖基础配置
  if (!toolkit.isNullOrWhiteSpace(customConfigFilePath)) {
    // var customFileData = fs.readFileSync(customConfigFilePath);
    // var customObj = yaml.load(customFileData);
    request(customConfigFilePath, function(error, response, data) {
      if (error) {
        console.log('配置中心', colors.red('获取配置失败'));
      }
      var resData = JSON.parse(data);

      if (resData.errorCode) {
        console.log('配置中心', colors.red('获取配置失败'));
      }

      var customObj = toolkit.fromBase64(resData.node.value);
      toolkit.objUpdate(customObj, obj);
    })
  }

  exports.CONFIG = obj;
};

exports是同步处理的方式,无法导出etcd获取的数据,在保持源码大致逻辑不变的情况下,怎么处理该问题?

阅读 4.5k
2 个回答

1,把request搞成同步的
2,我是这么想的:
module:test1.js

module.exports = new Promise((resolve, reject) => {
    setTimeout(() => { resolve("asd"); }, 1000);
});

app.js

(async () => {
    let a = await require("./test1");
    console.log(a);
})();

exports一个Promise,至于外部是promise.then也好是async/await也好那是外部的事。

其次,个人认为这里配置中心的侵入太强了,会影响太多的进程,个人认为在配置中心配套agent只做配置文件同步就好了(或者其他功能扩展也放这,尽量与服务无关),读取还是本地,这样不至于配置中心挂了所有服务都没法启动。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题