Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Vikash Rathee
Vikash Rathee

Posted on

     

I built an URL shortener with Cloudflare KV

I am building an open source, highly scalable, and low-costURL shortener with Cloudflare KV

URL shortening software

By low-cost I mean, just $5 per month on Cloudflare worker and a free plan for basic requirement -

Idea

AtDaySchedule, we had many customer upvoted for a URL shortener feature with auto-expirable links to book an appointment instead sharing their original URL.

So, I decided to try Cloudflare for this project -

By leveraging Cloudflare KV's capabilities, the goal was to develop a solution that offered not onlyURL shortening but also customization options, analytics, and scalability, all while maintaining a significantly lower cost compared to our established services on AWS.

Features

API

I usedhono.dev by@yusukebe for API routing, and it's blazing fast and offers Cloudflare pages template to build Edge projects quickly.

Here is an example ofserver.ts from their docs -

import { Hono } from 'hono'const app = new Hono()app.get('/', (c) => c.text('Hono!'))export default app
Enter fullscreen modeExit fullscreen mode

Controller

The/links API is all I need to create, update and manage the short 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    );  });
Enter fullscreen modeExit fullscreen mode

Code explanations -

This code isPOST request to create short links. Here's a breakdown of the code to explain what all I am doing:

  1. const links = new Hono<{ Bindings: Bindings }>(): It creates an instance of the Hono object.

  2. Validation with zod - Thevalidator('json', (value, c) => {...}): function is used as a middleware for validating the incoming JSON payload defined inlinkSchema.

  3. Set expiration: Checks if an expiry date is provided in the payload. If not, it sets an expiry date one month from the current date and time.

  4. Generates a unique key for the link usingnanoid(7) or uses the provided key from the payload if available.

  5. Stores the link data (converted to a JSON string) in the Cloudflare KV (SHORTLINKS) with an expiration time based on the calculated expiry date.

Demo

The demo is available onIDM, it's free to use and open-sourced on Github tobuild your own custom URL shortener.

Short your links

You can clone the repo to deploy on your Cloudflare account.

Star the repository on Github to show your support :-)

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Founder of Agenty
  • Location
    New Delhi
  • Work
    Founder at Agenty
  • Joined

Trending onDEV CommunityHot

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp