📅  最后修改于: 2023-12-03 14:52:11.540000             🧑  作者: Mango
在软件开发中,通知用户和管理员发生异常或事件是非常重要的。但是,经常需要将警报通知发送到多个目的地,例如电子邮件、短信、Slack频道等。本文将介绍如何使用TypeScript向多个目的地发送警报通知。
我们将使用Node.js和TypeScript创建一个简单的命令行应用程序,用于发送警报通知。我们将使用不同的通信渠道,如电子邮件和Slack频道。有关示例应用程序的示意图如下:
首先,我们需要配置我们的应用程序,以便它可以连接到不同的目标。我们将编写以下通信模块并将其公开:
然后我们将在我们的应用程序中使用这些通信模块,并根据需要扩展其功能。
在开始之前,您需要安装以下内容:
首先,我们将设置新的TypeScript项目。在终端中,导航到您要创建项目的目录并执行以下命令:
npm init -y
npm install --save-dev typescript
然后,使用运行以下命令初始化TypeScript项目:
npx tsc --init
接下来,我们需要安装我们的项目的依赖项。我们将使用以下NPM包:
@slack/web-api
安装Slack通信模块nodemailer
安装Email通信模块prompt-sync
安装用于交互式提示的工具包您可以通过以下命令安装这些包:
npm install --save @slack/web-api nodemailer prompt-sync
现在,我们将编写通知模块,包括Email模块和Slack模块。在项目根目录中创建一个名为notify
的文件夹,并在其中创建以下文件:
email.ts
用于发送电子邮件的模块slack.ts
用于在Slack频道上发布的模块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,
});
}
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;
}
现在,我们将编写我们的通知应用程序,用于使用我们的通知模块。在项目根目录中创建一个名为src
的文件夹,并在其中创建以下文件:
index.ts
主应用程序文件config.ts
包含应用程序配置的文件utils.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.sender
和slack.token
替换为您的电子邮件凭据和Slack机器人令牌。请注意,我们还设置了Slack的默认频道。
我们将创建一个实用程序文件,以提供交互式提醒。在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
。在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);
最后,将TypeScript代码编译为JavaScript。使用此命令:
npx tsc
该命令将在项目目录中创建一个名为dist
的新文件夹,并在其中为每个TypeScript源文件创建JavaScript文件。
现在,我们可以使用以下命令运行我们的应用程序:
node dist/index.js
您可以按照应用程序提示输入必要信息,例如收件人地址和通知渠道。根据您的选择,该应用程序将使用电子邮件或Slack将通知发送给目标。
本文介绍了如何使用TypeScript构建一个简单的通知应用程序,该应用程序可以将通知发送到电子邮件和Slack频道。我们使用Node.js和几个NPM包来实现此目的,并使用TypeScript编写了通知模块和应用程序代码。
我们还看到了如何在应用程序中使用配置文件,以便在不同的环境中轻松地配置应用程序。我们还构建了一个简单的交互式命令行界面来接收用户输入。
这是使用TypeScript和Node.js构建应用程序的良好示例,可以轻松扩展以满足您的需求。