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

发布于 2022-09-07 04:13:34 字数 1938 浏览 29 评论 0

  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获取的数据,在保持源码大致逻辑不变的情况下,怎么处理该问题?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猫性小仙女 2022-09-14 04:13:34

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);
})();
苏辞 2022-09-14 04:13:34

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文