」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何從頭開始製作 URL 縮短器

如何從頭開始製作 URL 縮短器

發佈於2024-11-08
瀏覽:137

從頭開始製作應用程式是我最喜歡的學習應用程式運作方式的方式。這篇文章將討論如何從頭開始製作 URL 縮短器。

How to make a URL Shortener from scratch

URL 縮短器非常容易製作,在我看來,這是初學者學習語言的好方法。更困難的部分是添加自訂網域、分析、分組連結以及在 URL 縮短服務之上添加的其他功能。因此,您可以按照以下方法從頭開始製作一個。

在本教程中,我們將使用 hono (nodejs)、drizzle orm 和 postgres,但它可以使用任何語言和框架來完成,請查看我的 sveltekit/golang 實作 kon.sh,github 中的原始程式碼。

首先創建一個新的 hono 專案

npm create hono@latest

然後填寫以下資訊

[email protected]
Ok to proceed? (y)
create-hono version 0.13.1
? Target directory url-shortener
? Which template do you want to use? nodejs
? Do you want to install project dependencies? yes
? Which package manager do you want to use? npm

確保您已準備好 postgres 資料庫並建立一個名為 url-shortener 的新資料庫。

在 src/ 資料夾下應該有一個 index.ts 文件,該文件包含運行 api 伺服器的程式碼。這裡我們需要新增2個api路由。

  • 建立縮短器
  • 用於重定向傳入請求的全部路由

src/index.ts

app.post("/api/shortener", async (c) => {
    // create shortener route
    return c.text("Not yet implemented");
});

app.get("/:code", async (c) => {
    // redirect
    return c.text("Not yet implemented");
});

現在我們可以安裝 drizzle orm 並初始化我們的資料庫。首先,安裝所需的軟體套件

npm i drizzle-orm postgres
npm i -D drizzle-kit

然後我們需要在src資料夾下新建db資料夾,並新增index.ts用於初始化db客戶端,schema.ts用於資料庫schema。

src/db/schema.ts

import { pgTable, text, varchar } from "drizzle-orm/pg-core";

export const shortener = pgTable("shortener", {
    id: text("id").primaryKey(),
    link: varchar("link", { length: 255 }).notNull(),
    code: varchar("code", { length: 255 }).notNull().unique(),
});

src/db/index.ts

import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import * as schema from "./schema";

const queryClient = postgres(
    "postgres://postgres:[email protected]:5432/url-shortener"
);
export const db = drizzle(queryClient, { schema });

然後在根資料夾中建立一個 drizzle.config.ts 檔案。

drizzle.config.ts

// drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
    schema: "./src/db/schema.ts",
    out: "./drizzle",
    dialect: "postgresql",
    dbCredentials: {
        url: "postgres://postgres:[email protected]:5432/url-shortener",
    },
});

運行 npx drizzle-kit push 將架構推送到資料庫。

npx drizzle-kit push

完成所有設定後,我們終於可以處理 api 了,運行 npm run dev 來啟動伺服器

npm run dev

首先製作一個隨機字串產生器。在src下新建一個資料夾,命名為utils,然後建立一個index.ts檔案。

index.ts

export function generateId(length: number) {
    let result = "";
    const characters =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    const charactersLength = characters.length;
    for (let i = 0; i 



然後更新建立縮短路線。

app.post("/api/shortener", async (c) => {
    const body = await c.req.json();

    const link = body.link;

    const code = generateId(6);

    await db.insert(shortener).values({
        id: generateId(8),
        link,
        code,
    });

    return c.json({ code });
});

然後您可以向包含連結的端點發出發布請求以產生新的縮短器。這是在我的 VSCode 中使用 Thunder Client 的範例:
How to make a URL Shortener from scratch

最後,更新重定向api。

app.get("/:code", async (c) => {
    const code = c.req.param("code");

    const link = await db
        .select()
        .from(shortener)
        .where(eq(shortener.code, code));

    if (link.length === 0) {
        return c.text("Invalid code");
    }

    return c.redirect(link[0].link);
});

然後在瀏覽器上導航至 http://localhost:3000/{code},您將被重定向到原始連結。

就是這樣。 URL 縮短器是開始學習新語言的好方法,您可以使用該語言流行的後端框架並學習使用該語言與資料庫進行通訊。

還有很多東西需要探索,例如為縮短程式產生 QR 程式碼、記錄分析重新導向、自訂網域等等。這些不在本教程中涵蓋。

查看我的 github 查看我的作品,我的所有專案都是開源的,免費供任何人學習和貢獻。

我也樂於接受新想法,儘管我目前的技能可能與難度不相符。歡迎在評論中分享。

版本聲明 本文轉載於:https://dev.to/tzgyn/how-to-make-a-url-shortener-from-scratch-ec5?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 變化偵測從 Angular zone.js) 到 Angular (provideExperimentalZonelessChangeDetection) 的演變
    變化偵測從 Angular zone.js) 到 Angular (provideExperimentalZonelessChangeDetection) 的演變
    更改偵測是 Angular 的一個基本面,負責識別和更新 DOM 中因資料修改或使用者互動而發生變更的部分。此過程可確保 UI 與底層資料保持一致,從而增強使用者體驗和應用程式效能。 Zone.js 的作用 從歷史上看,Angular 一直依賴 Zone.js 來實現其變更檢測機制...
    程式設計 發佈於2024-11-08
  • 使用 Streamlit 深入研究數據應用程式
    使用 Streamlit 深入研究數據應用程式
    The ability to quickly develop and deploy interactive applications is invaluable. Streamlit is a powerful tool that enables data scientists and develo...
    程式設計 發佈於2024-11-08
  • Go 中的匿名結構:何時在 `map[string]struct{}` 中指定類型是多餘的?
    Go 中的匿名結構:何時在 `map[string]struct{}` 中指定類型是多餘的?
    匿名結構:揭示struct{}{} 和{} 之間的差異在Go 中,聲明字串到匿名結構映射可以透過兩種方式完成:var Foo = map[string]struct{}{ "foo": struct{}{}, }var Foo = map[string]struct{}{...
    程式設計 發佈於2024-11-08
  • 我如何為我的 React Native 專案設定設計系統以加快開發速度
    我如何為我的 React Native 專案設定設計系統以加快開發速度
    曾经构建过您不想自己使用的应用程序吗? 当我还是初级应用程序开发人员时,我曾经构建混乱的用户界面。 有时,当看到这些 UI 时,我曾经想“世界上谁会想使用这个?它看起来很糟糕”。 其他时候,只是有些“不对劲的地方”我无法指出。 虽然我曾经从设计团队那里获得过令人惊叹的精美设计,但我的应用程序看起来连...
    程式設計 發佈於2024-11-08
  • 如何使用 PHP 有效率地檢查檔案中的字串?
    如何使用 PHP 有效率地檢查檔案中的字串?
    如何在PHP 中檢查文件是否包含字串要確定文件中是否存在特定字串,讓我們探索一下解決方案和更有效的替代方案。 原始程式碼:提供的程式碼嘗試檢查檔案中是否存在字串,由變數 $id 表示,透過逐行讀取檔案。但是,while 迴圈中的條件 (strpos($buffer, $id) === false) ...
    程式設計 發佈於2024-11-08
  • 如何在不離開目前頁面的情況下開啟下載視窗?
    如何在不離開目前頁面的情況下開啟下載視窗?
    在不離開當前頁面的情況下打開下載視窗的最簡單方法要在不離開當前頁面或打開彈出視窗的情況下開啟下載對話框,使用以下跨瀏覽器JavaScript:window.location.assign(url);此方法不會開啟新視窗或選項卡,甚至在 Internet Explorer 6 中也能正常運作。 透過將...
    程式設計 發佈於2024-11-08
  • 如何在 C++ 中使用虛擬模板方法實現多態性?
    如何在 C++ 中使用虛擬模板方法實現多態性?
    C 虛擬模板方法在C 中,將靜態時間多態性(模板)與運行時多態性結合起來可能具有挑戰性。這在以下抽象類別中很明顯:class AbstractComputation { public: template <class T> virtual void setData...
    程式設計 發佈於2024-11-08
  • 多執行緒:工程師的關鍵概念 - 第 1 部分
    多執行緒:工程師的關鍵概念 - 第 1 部分
    了解关键的多线程概念对于软件开发人员至关重要,因为它不仅可以增强技能,还可以直接影响应用程序开发、可扩展性和软件解决方案的整体质量。 原子性 在多线程上下文中,原子操作确保一个线程可以执行一系列操作,而不会被其他线程中断。多个线程可能会尝试同时读取或写入共享数据。如果没有原子性,并...
    程式設計 發佈於2024-11-08
  • 後端開發路線圖
    後端開發路線圖
    對於所有有抱負的後端開發人員,我知道導航您的學習道路是多麼令人畏懼。這就是為什麼我很高興能夠提供詳細的路線圖來幫助您掌握用於後端開發的 JavaScript! ? 1️⃣ 從基礎開始:熟悉 JavaScript 基礎知識。理解變數、函數和控制結構至關重要。 2️⃣ 深入了解 Node.js:這個...
    程式設計 發佈於2024-11-08
  • 如何在Go中呼叫Linux共享函式庫函數?
    如何在Go中呼叫Linux共享函式庫函數?
    在Go 中呼叫Linux 共享庫函數在此問題中,開發人員尋求從共享對象(.so) 調用函數的幫助他們的Go 程式碼中的檔案。 Python 中的 ctypes 套件可以存取 C 函數,可以作為所需的功能。 使用 cgo 進行靜態共享庫載入靜態呼叫函數在編譯時已知共享庫,可以使用 cgo 套件。以下是...
    程式設計 發佈於2024-11-08
  • Java 中的字串文字是否會被垃圾收集?
    Java 中的字串文字是否會被垃圾收集?
    字串文字的垃圾收集Q1:如果一個字串在編譯時被定義為文字(例如,String str = "java"),它會被垃圾收集嗎? 通常不會。程式碼物件包含對文字 String 物件的引用,使它們保持可訪問性。垃圾回收僅在程式碼物件變得不可存取時發生。 Q2:如果使用intern 方法...
    程式設計 發佈於2024-11-08
  • 跨平台使用 RSA 加密和解密保護數據
    跨平台使用 RSA 加密和解密保護數據
    RSA加密簡介 在當今的數位環境中,保護敏感資料對於個人和組織都至關重要。 RSA (Rivest-Shamir-Adleman) 加密作為保護資料的強大解決方案脫穎而出。它是一種非對稱加密演算法,這意味著它使用一對金鑰:用於加密的公鑰和用於解密的私鑰。 RSA 加密的主要好處之一...
    程式設計 發佈於2024-11-08
  • 如何利用導師在數位行銷中實現職業發展
    如何利用導師在數位行銷中實現職業發展
    在当今快速发展的数字营销环境中,保持领先趋势并提高您的技能至关重要。加速该领域职业发展的最有效方法之一是利用指导。无论您是刚刚起步还是希望晋升为领导角色,数字营销导师都可以提供宝贵的指导和见解,帮助您实现职业目标。本文探讨了指导如何塑造您的职业轨迹,并提供了充分利用指导经验的策略。 ...
    程式設計 發佈於2024-11-08
  • 將 Cloudinary 整合到 Next.js 應用程式中
    將 Cloudinary 整合到 Next.js 應用程式中
    以了解 Cloudinary 及其定價。 1. 建立一個Cloudinary帳戶 如果您沒有帳戶,請在 Cloudinary 註冊並建立一個新帳戶。 2.安裝Cloudinary SDK 您可以使用npm或yarn安裝Cloudinary SDK: npm ins...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3