返回
用 Node.js、TypeScript、Jest 和 CI 定时每日给女朋友发送一条消息(详细技术指南)
前端
2024-01-12 02:49:10
前言
我们作为技术人员,每天都在研究新技术,解决复杂问题。但有时候,最简单的项目也能带来最大的喜悦,就像给爱人发送一条日常信息一样。本文将分享如何使用 Node.js、TypeScript、Jest 和 CI 构建一个简单的定时任务,每天给你的女朋友发送一条消息。
技术栈
我们使用以下技术栈:
- Node.js:用于编写服务器端代码
- TypeScript:用于类型化代码并防止错误
- Jest:用于编写单元测试
- CI:用于自动构建、测试和部署代码
架构
我们的应用程序将具有以下架构:
- 消息生成器: 负责生成要发送的消息
- 消息发送器: 负责通过电子邮件或短信发送消息
- 定时调度程序: 负责在特定时间触发消息发送
实现
消息生成器
// messageGenerator.ts
import { Message } from "./message";
export class MessageGenerator {
generate(): Message {
// 这里可以根据自己的喜好实现消息生成逻辑
return {
content: "今天过得怎么样?爱你哦!🥰",
};
}
}
消息发送器
// messageSender.ts
import { Message } from "./message";
export class MessageSender {
async send(message: Message): Promise<void> {
// 这里可以根据自己的喜好实现消息发送逻辑
// 比如使用 Nodemailer 发送电子邮件或 Twilio 发送短信
console.log(`发送消息:${message.content}`);
}
}
定时调度程序
// scheduler.ts
import { MessageGenerator } from "./messageGenerator";
import { MessageSender } from "./messageSender";
export class Scheduler {
constructor(private generator: MessageGenerator, private sender: MessageSender) {}
async schedule(): Promise<void> {
// 获取当前日期和时间
const now = new Date();
// 设置发送消息的时间为明天早上 9:00
const tomorrow = new Date();
tomorrow.setDate(now.getDate() + 1);
tomorrow.setHours(9);
tomorrow.setMinutes(0);
// 创建定时器在指定时间发送消息
setTimeout(() => {
this.sendMessage();
}, tomorrow.getTime() - now.getTime());
}
async sendMessage(): Promise<void> {
const message = this.generator.generate();
await this.sender.send(message);
}
}
单元测试
为了确保应用程序的可靠性,我们编写了单元测试:
// messageGenerator.test.ts
import { MessageGenerator } from "./messageGenerator";
describe("MessageGenerator", () => {
it("should generate a message", () => {
const generator = new MessageGenerator();
const message = generator.generate();
expect(message.content).not.toBeNull();
});
});
// messageSender.test.ts
import { MessageSender } from "./messageSender";
describe("MessageSender", () => {
it("should send a message", async () => {
const sender = new MessageSender();
await sender.send({ content: "Test message" });
// 使用模拟函数来验证消息是否已发送
expect(console.log).toHaveBeenCalledWith("发送消息:Test message");
});
});
CI 集成
为了自动化构建、测试和部署过程,我们将应用程序与 CI 集成了。我们使用 GitHub Actions,配置如下:
name: CI
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 16
- run: npm install
- run: npm test
- run: npm run build
- uses: actions/upload-artifact@v2
with:
name: artifacts
path: dist
部署
我们使用 Heroku 部署应用程序。Heroku 是一个云平台,可托管 Node.js 应用程序。
运行应用程序
要运行应用程序,请按照以下步骤操作:
- 克隆项目:
git clone https://github.com/username/project-name
- 安装依赖项:
npm install
- 运行应用程序:
npm run start
应用程序将在端口 3000 上运行。
结论
本文展示了如何使用 Node.js、TypeScript、Jest 和 CI 构建一个简单的定时任务,每天给你的女朋友发送一条消息。该项目涵盖了敏捷开发、单元测试、CI 集成和自动化部署等方面的知识。希望本文能激发你的灵感,并帮助你创建自己的创意项目。