【问题标题】:How to wrap multiple function with additional variables如何用附加变量包装多个函数
【发布时间】:2022-01-20 23:31:09
【问题描述】:

您好,我有这样的文件

const logger = require("./logger");
const { asyncLocalStorage } = require("../localStorage/storage");

const getContextData = () => {
  const roomName = asyncLocalStorage.getStore()?.get("roomName") || "";
  const userId = asyncLocalStorage.getStore()?.get("userId") || "";
  const userName = asyncLocalStorage.getStore()?.get("userName") || "";

  return { roomName, userId, userName };
};

const logInfo = (message, additionalData) => {
  const { roomName, userId, userName } = getContextData();
  logger.info(message, { roomName, userId, userName, additionalData });
};

const logWarn = (message, additionalData) => {
  const { roomName, userId, userName } = getContextData();
  logger.warn(message, { roomName, userId, userName, additionalData });
};

const logError = (message, additionalData) => {
  const { roomName, userId, userName } = getContextData();
  logger.error(message, { roomName, userId, userName, additionalData });
};

module.exports = {
  logInfo,
  logWarn,
  logError,
};

这基本上是用我的附加数据包装 winston log 函数,我不喜欢这样,这是多余的。我的意思是这三个功能看起来基本相同。当我想要更改所有内容时,添加另一个级别的日志记录会变得混乱。

有没有这样的方法

func wrapper() {
  const { roomName, userId, userName } = getContextData();
}
const logWarn = (message, additionalData) => {
  logger.warn(message, { roomName, userId, userName, additionalData });
};
logWarn = wrapper(logWarn);

不必看起来完全像这样。但只是我正在寻找一种方法来写得更干净,然后就是现在

【问题讨论】:

    标签: javascript refactoring winston


    【解决方案1】:

    由于它们都是相同的,您可以生成它们:

    const exports = {};
    
    ["info", "warn", "error"].forEach(level => {
      // create the function name from level: logInfo, logWarn, logError
      const funcName = "log" + level.charAt(0).toUpperCase() + level.slice(1);
      // create the function itself and store it in the export object
      exports[funcName] = (message, additionalData) => {
        const { roomName, userId, userName } = getContextData();
        // since I don't know whether or not `logger` uses `this`, it is best to
        // be careful and preserve it, because it would be lost if we wrote simply
        // logger[level](message, { roomName, userId, userName, additionalData });
        logger[level].call(logger, message, { roomName, userId, userName, additionalData });
      };
    };
    
    module.exports = exports;
    

    【讨论】:

    • 谢谢,我实际上是在寻找一种方法来迭代这些,很好的答案!
    • 我认为这正是我想要的,但是当我写这篇文章时,它看起来对我来说很乱,但是学习很酷
    【解决方案2】:

    您可以有一个通用函数,可以调用 logger.warn、logger.info 等,并在该函数内检索 contextData。

    const getContextData = () => {
      const roomName = asyncLocalStorage.getStore()?.get("roomName") || "";
      const userId = asyncLocalStorage.getStore()?.get("userId") || "";
      const userName = asyncLocalStorage.getStore()?.get("userName") || "";
    
      return { roomName, userId, userName };
    };
    
    const logSomething = (message, additionalData, type) => {
      const { roomName, userId, userName } = getContextData();
      switch (type) {
        case "info":
        case "warn":
        case "error":
          logger[type](message, {roomName, userId, userName, additionalData});
          break;
        default:
          // error invalid "type"
      }
    }
    
    const logInfo = (message, additionalData) => logSomething(message, additionalData, "info");
    const logWarn = (message, additionalData) => logSomething(message, additionalData, "warn");
    const logError = (message, additionalData) => logSomething(message, additionalData, "error");
    
    module.exports = {
      logInfo,
      logWarn,
      logError,
    };

    【讨论】:

      【解决方案3】:

      我认为这可能比下面更清晰,但我只是想先告诉你我将如何处理这个问题。

      const logAll = (message, additionalData, messageType) => {
        const { roomName, userId, userName } = getContextData();
        if (messageType == 'info') {
            logger.info(message, { roomName, userId, userName, additionalData });
        }
        if (messageType == 'warn') {
            logger.warn(message, { roomName, userId, userName, additionalData });
        }
        if (messageType == 'error') {
            logger.error(message, { roomName, userId, userName, additionalData });
        }
      };
      

      【讨论】:

        猜你喜欢
        • 2021-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 2022-10-14
        • 1970-01-01
        • 2022-11-15
        相关资源
        最近更新 更多