📜  如何向多个目的地发送警报通知 - TypeScript (1)

📅  最后修改于: 2023-12-03 14:52:11.540000             🧑  作者: Mango

如何向多个目的地发送警报通知 - TypeScript

在软件开发中,通知用户和管理员发生异常或事件是非常重要的。但是,经常需要将警报通知发送到多个目的地,例如电子邮件、短信、Slack频道等。本文将介绍如何使用TypeScript向多个目的地发送警报通知。

目录
  1. 方案概述
  2. 准备工作
  3. 使用TypeScript撰写代码
  4. 运行代码
  5. 总结
方案概述

我们将使用Node.js和TypeScript创建一个简单的命令行应用程序,用于发送警报通知。我们将使用不同的通信渠道,如电子邮件和Slack频道。有关示例应用程序的示意图如下:

通知应用程序示意图

首先,我们需要配置我们的应用程序,以便它可以连接到不同的目标。我们将编写以下通信模块并将其公开:

  • Email通信模块
  • Slack通信模块

然后我们将在我们的应用程序中使用这些通信模块,并根据需要扩展其功能。

准备工作

在开始之前,您需要安装以下内容:

使用TypeScript撰写代码
步骤1:初始化TypeScript项目

首先,我们将设置新的TypeScript项目。在终端中,导航到您要创建项目的目录并执行以下命令:

npm init -y
npm install --save-dev typescript

然后,使用运行以下命令初始化TypeScript项目:

npx tsc --init
步骤2:安装依赖项

接下来,我们需要安装我们的项目的依赖项。我们将使用以下NPM包:

  • @slack/web-api 安装Slack通信模块
  • nodemailer 安装Email通信模块
  • prompt-sync 安装用于交互式提示的工具包

您可以通过以下命令安装这些包:

npm install --save @slack/web-api nodemailer prompt-sync
步骤3:编写通知模块

现在,我们将编写通知模块,包括Email模块和Slack模块。在项目根目录中创建一个名为notify的文件夹,并在其中创建以下文件:

  1. email.ts 用于发送电子邮件的模块
  2. slack.ts 用于在Slack频道上发布的模块

email.ts

import nodemailer from 'nodemailer';

interface EmailSenderOptions {
  service: string;
  user: string;
  pass: string;
}

interface EmailRecipient {
  name: string;
  email: string;
}

interface EmailOptions {
  from: EmailRecipient;
  to: EmailRecipient[];
  subject: string;
  text?: string;
  html?: string;
}

export async function sendEmail(options: EmailOptions, sender: EmailSenderOptions) {
  const transporter = nodemailer.createTransport({
    service: sender.service,
    auth: {
      user: sender.user,
      pass: sender.pass,
    },
  });

  // Send email
  return await transporter.sendMail({
    from: `"${options.from.name}" <${options.from.email}>`,
    to: options.to.map(r => `"${r.name}" <${r.email}>`).join(','),
    subject: options.subject,
    text: options.text,
    html: options.html,
  });
}

slack.ts

import { WebClient, ChatPostMessageArguments } from '@slack/web-api';

export async function postToSlack(channel: string, message: string, token: string) {
  // Create the client with the token
  const client = new WebClient(token);

  // Post the message
  const result = await client.chat.postMessage({
    channel: channel,
    text: message,
  } as ChatPostMessageArguments);

  // Return the message result
  return result;
}
步骤4:编写通知应用程序

现在,我们将编写我们的通知应用程序,用于使用我们的通知模块。在项目根目录中创建一个名为src的文件夹,并在其中创建以下文件:

  1. index.ts 主应用程序文件
  2. config.ts 包含应用程序配置的文件
  3. utils.ts 包含应用程序实用程序的文件

config.ts

我们将使用配置文件来存储应用程序的设置。在src文件夹中创建一个名为config.ts的文件,并添加以下内容:

export interface Config {
  email: {
    sender: {
      service: string;
      user: string;
      pass: string;
    };
  };
  slack: {
    token: string;
    defaultChannel: string;
  };
}

export const config: Config = {
  email: {
    sender: {
      service: 'gmail',
      user: 'my-email-address@gmail.com',
      pass: 'my-email-password',
    },
  },
  slack: {
    token: 'my-slack-bot-token',
    defaultChannel: '#general',
  },
};

email.senderslack.token替换为您的电子邮件凭据和Slack机器人令牌。请注意,我们还设置了Slack的默认频道。

utils.ts

我们将创建一个实用程序文件,以提供交互式提醒。在src文件夹中创建一个名为utils.ts的文件,添加以下内容:

import promptSync from 'prompt-sync';

const prompt = promptSync({ sigint: true });

export function promptText(message: string) {
  return prompt(message);
}

export function promptOptions(message: string, options: string[]) {
  const result = prompt(`${message} (${options.join('/')}) `);
  if (!options.includes(result)) {
    throw new Error(`Invalid option: ${result}`);
  }
  return result;
}

export function promptChannel(message: string, defaultValue: string = '') {
  const defaultVal = defaultValue ? ` (${defaultValue})` : '';
  const result = prompt(`${message}${defaultVal}: `) || defaultValue;
  return result;
}

index.ts

现在,我们将创建应用程序的主文件,index.ts。在src文件夹中创建一个名为index.ts的文件,并添加以下内容:

import { promptText, promptOptions, promptChannel } from './utils';
import { sendEmail } from '../notify/email';
import { postToSlack } from '../notify/slack';
import { config } from './config';

const CHANNELS = ['email', 'slack'];

async function main() {
  // Prompt the user for input
  const to = promptText('To: ');
  const subject = promptText('Subject: ');
  const text = promptText('Message: ');

  // Prompt the user for the notification channel
  const channel = promptOptions('Channel?', CHANNELS);

  // Send the notification based on the selected channel
  switch(channel) {
    case 'email': {
      const email = {
        from: { name: 'My Name', email: config.email.sender.user },
        to: [{ name: 'Receiver Name', email: to }],
        subject: subject,
        text: text,
      };
      await sendEmail(email, config.email.sender);
      break;
    }
    case 'slack': {
      const message = `*${subject}*\n${text}`;
      const slackChannel = promptChannel('Channel', config.slack.defaultChannel);
      await postToSlack(slackChannel, message, config.slack.token);
      break;
    }
  }

  console.log('Notification sent!');
}

main().catch(console.error);
步骤5:编译TypeScript代码

最后,将TypeScript代码编译为JavaScript。使用此命令:

npx tsc

该命令将在项目目录中创建一个名为dist的新文件夹,并在其中为每个TypeScript源文件创建JavaScript文件。

运行代码

现在,我们可以使用以下命令运行我们的应用程序:

node dist/index.js

您可以按照应用程序提示输入必要信息,例如收件人地址和通知渠道。根据您的选择,该应用程序将使用电子邮件或Slack将通知发送给目标。

总结

本文介绍了如何使用TypeScript构建一个简单的通知应用程序,该应用程序可以将通知发送到电子邮件和Slack频道。我们使用Node.js和几个NPM包来实现此目的,并使用TypeScript编写了通知模块和应用程序代码。

我们还看到了如何在应用程序中使用配置文件,以便在不同的环境中轻松地配置应用程序。我们还构建了一个简单的交互式命令行界面来接收用户输入。

这是使用TypeScript和Node.js构建应用程序的良好示例,可以轻松扩展以满足您的需求。