Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

137
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda