Как я создал недорогой инструмент для сокращения URL-адресов с помощью Cloudflare KV
15 декабря 2023 г.Я создаю легко масштабируемый и недорогой сокращатель URL-адресов с открытым исходным кодом с помощью Cloudflare KV.
Под низкой стоимостью я подразумеваю всего 5 долларов США в месяц на Cloudflare Worker и бесплатный план для базовых требований.
Идея
В 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
для создания коротких ссылок. Вот разбивка кода, поясняющая, что я делаю:
constlinks = new Hono<{ Bindings: Bindings }>():
Создается экземпляр объекта Hono.- Проверка с помощью zod. Функция
validator('json', (value, c) => {...}):
используется в качестве промежуточного программного обеспечения для проверки входящей полезной нагрузки JSON, определенной вlinkSchema
. - Установить срок действия: проверяет, указана ли дата истечения срока действия в полезных данных. В противном случае устанавливается срок действия на один месяц от текущей даты и времени.
- Генерирует уникальный ключ для ссылки с помощью
nanoid(7)
или использует предоставленный ключ из полезных данных, если он доступен. - Сохраняет данные ссылки (преобразованные в строку JSON) в Cloudflare KV (< code>SHORTLINKS) со сроком действия, основанным на рассчитанной дате истечения срока действия. ол>
Демо
Демо-версия доступна на IDM, ее можно использовать бесплатно, а исходный код доступен на Github для создания собственного средства сокращения URL-адресов. сильный>.
Вы можете клонировать репозиторий для развертывания в своей учетной записи Cloudflare.
Не забудьте пометить репозиторий на GitHub, чтобы выразить свою поддержку :-)
:::информация Также опубликовано здесь.
:::
Оригинал