返回

用 Node.js、TypeScript、Jest 和 CI 定时每日给女朋友发送一条消息(详细技术指南)

前端

前言

我们作为技术人员,每天都在研究新技术,解决复杂问题。但有时候,最简单的项目也能带来最大的喜悦,就像给爱人发送一条日常信息一样。本文将分享如何使用 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 应用程序。

运行应用程序

要运行应用程序,请按照以下步骤操作:

  1. 克隆项目:git clone https://github.com/username/project-name
  2. 安装依赖项:npm install
  3. 运行应用程序:npm run start

应用程序将在端口 3000 上运行。

结论

本文展示了如何使用 Node.js、TypeScript、Jest 和 CI 构建一个简单的定时任务,每天给你的女朋友发送一条消息。该项目涵盖了敏捷开发、单元测试、CI 集成和自动化部署等方面的知识。希望本文能激发你的灵感,并帮助你创建自己的创意项目。