Как я создал недорогой инструмент для сокращения URL-адресов с помощью Cloudflare KV

Как я создал недорогой инструмент для сокращения URL-адресов с помощью Cloudflare KV

15 декабря 2023 г.

Я создаю легко масштабируемый и недорогой сокращатель URL-адресов с открытым исходным кодом с помощью Cloudflare KV.

Под низкой стоимостью я подразумеваю всего 5 долларов США в месяц на Cloudflare Worker и бесплатный план для базовых требований.

URL shortening software

Идея

В DaySchedule многие клиенты проголосовали за функцию сокращения URL-адресов с автоматически истекающими ссылками для записи на прием вместо того, чтобы делиться своим исходным URL-адресом.

Итак, я решил попробовать Cloudflare для этого проекта -

Используя возможности Cloudflare KV, целью было разработать решение, которое предлагало бы не только сокращение URL-адресов, но и параметры настройки, аналитику и масштабируемость, сохраняя при этом значительно более низкую стоимость по сравнению с нашими традиционными услугами на AWS.

Функции

  • Ссылки с истекающим сроком действия с использованием параметра cacheTtl на KV
  • Личный домен с использованием Cloudflare для SaaS
  • Аналитика с использованием Worker Analytics

API

Я использовал hono.dev от @yusukebe для маршрутизации API, он работает очень быстро и предлагает страницы Cloudflare. шаблон для быстрого создания проектов Edge.

Вот пример server.ts из их документации -

import { Hono } from 'hono'
const app = new Hono()

app.get('/', (c) => c.text('Hono!'))

export default app

Контроллер

API /links — это все, что мне нужно для создания, обновления и управления короткими ссылками.

const links = new Hono<{ Bindings: Bindings }>();

links.post(
  '/',
  validator('json', (value, c) => {
    const parsed = linkSchema.safeParse(value);
    if (!parsed.success) {
      return c.json(parsed, 400);
    }
    return parsed.data as ShortLink;
  }),
  async (ctx) => {
    const data = ctx.req.valid('json');
    // Set expire_at if given, or fallback to 1 month expiry
    const expireAt = data.expire_at
      ? dayjs(data.expire_at).unix()
      : dayjs().add(1, 'month').unix();
    if (expireAt <= dayjs().unix()) {
      return ctx.json(
        { message: 'The expire_at must be greater then current date time' },
        400
      );
    }

    let key = data.key || nanoid(7);
    let exists = await ctx.env.SHORTLINKS.get(key);
    while (exists) {
      key = nanoid(7);
      exists = await ctx.env.SHORTLINKS.get(key);
    }
    await ctx.env.SHORTLINKS.put(key, JSON.stringify(data), {
      expiration: expireAt,
    });
    return ctx.json(
      { ...data, key: key, short_url: `https://idm.in/${key}` },
      200
    );
  }
);

Пояснения к коду -

Этот код представляет собой запрос POST для создания коротких ссылок. Вот разбивка кода, поясняющая, что я делаю:

  1. constlinks = new Hono<{ Bindings: Bindings }>(): Создается экземпляр объекта Hono.
  2. Проверка с помощью zod. Функция validator('json', (value, c) => {...}): используется в качестве промежуточного программного обеспечения для проверки входящей полезной нагрузки JSON, определенной в linkSchema.
  3. Установить срок действия: проверяет, указана ли дата истечения срока действия в полезных данных. В противном случае устанавливается срок действия на один месяц от текущей даты и времени.
  4. Генерирует уникальный ключ для ссылки с помощью nanoid(7) или использует предоставленный ключ из полезных данных, если он доступен.
  5. Сохраняет данные ссылки (преобразованные в строку JSON) в Cloudflare KV (< code>SHORTLINKS) со сроком действия, основанным на рассчитанной дате истечения срока действия.
  6. Демо

    Демо-версия доступна на IDM, ее можно использовать бесплатно, а исходный код доступен на Github для создания собственного средства сокращения URL-адресов. сильный>.

    n Сократите ссылки

    Вы можете клонировать репозиторий для развертывания в своей учетной записи Cloudflare.

    Не забудьте пометить репозиторий на GitHub, чтобы выразить свою поддержку :-)

    :::информация Также опубликовано здесь.

    :::


    Оригинал