Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

138
Visualizações
How to wrap multiple function with additional variables

Hi I have file like this

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,
};

Which is basically wrapping winston log function with my additional data and I don't like that, this is redundant. I mean all this three function looks basically the same. When I will want to change something all add another levels of logging it will become messy.

Is there a way to have something like this

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

Doesn't have to look exactly like this. But simply I am looking for a way to write it cleaner then it is now

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Since they are all the same, you can generate them:

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;
about 4 years ago · Juan Pablo Isaza Relatório

0

I think that could be cleaner than below, but I just wanted to give you an idea on how I would approach this in the first place.

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 });
  }
};
about 4 years ago · Juan Pablo Isaza Relatório

0

You could have a generic function that can call logger.warn, logger.info, etc, and retrieve the contextData once inside that function.

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,
};

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda