Остановить инициализацию модуля при импорте в Javascript - PullRequest
0 голосов
/ 07 февраля 2020

Я работаю над пакетом уведомлений и испытываю некоторые затруднения с тем, как обновить функцию, а не просто при ее импорте. Например:

В качестве функции уведомления у меня есть следующее:

const sendNotification = async (options: SendNotificationTypes) => {
  const handleChannel = {
    slack: async (options: SlackNotificationTypes) => {
      await sendSlack(options);
    },
    email: async (options: EmailNotificationTypes) => {
      await sendEmail(options);
    },
    sms: async (options: SMSNotificationTypes) => {
      await sendSms(options);
    }
  };

  options.channels.forEach(channel => {
    switch (channel) {
      case CHANNEL_SLACK:
        handleChannel.slack(options.slack);
        break;
      case CHANNEL_EMAIL:
        handleChannel.email(options.email);
        break;
      case CHANNEL_SMS:
        handleChannel.sms(options.sms);
        break;
    }
  });
};

Мой уведомитель слабины выглядит так:


const slack = new WebClient(tokenGoesHere)

const sendSlack = async (options: SlackNotificationTypes) => {
  try {
    await slack.chat.postMessage({
      channel: options.channel,
      ...(options.message && { text: options.message }),
      ...(options.blocks && { blocks: options.blocks }),
      ...(options.emoji && { icon_emoji: options.emoji }),
      ...(options.attachments && {
        attachments: options.attachments
      })
    });
  } catch (error) {
    throw new Error(`Slack notification failed to send: ${error}`);
  }
};

Так что это работает нормально, но код не работает в точках, если мои переменные окружения не на месте (так как я получаю токен слабости из process.env).

Вместо этого я хотел бы иметь возможность создавать функцию, когда она мне нужна, и передать в этот момент слабый жетон. В идеале, если есть способ не нуждаться в новом экземпляре каждый раз, когда я отправляю уведомление, я бы хотел это сделать.

Я довольно застрял в этом и думаю, что мне нужно, возможно, выполнить рефакторинг для класса? Любой совет приветствуется!

1 Ответ

1 голос
/ 07 февраля 2020

Просто лениво инициализируйте один экземпляр:

let slack = null; // token not yet available

async function sendSlack(options: SlackNotificationTypes) {
    if (!slack) {
        slack = new WebClient(tokenGoesHere) // hopefully available now
    }
    … // rest of the code using `slack` instance
}

Однако переменные среды должны всегда быть уже на месте, когда процесс запускается, или, по крайней мере, быть заполнены чем-то вроде dotenv до загрузки модулей, использующих их.

...