642 字
3 分鐘
[Day5] 用Workers做縮網址服務 — 30天實戰Cloudflare
本篇會講解如何透過Workers KV當資料庫,來製作一個縮網址服務。我們構想我們的服務會有個介面,可以輸入一串網址後,產生一個縮網址。
建立KV
KV是Cloudflare Workers中提供的Key-value資料庫,可以儲存資料,由於我們需要建立將短網址轉換成長網址,也需要將長網址轉換成短網址,因此我會建立兩個KV表做儲存。
先到Workers KV中建立兩個命名空間:url-to-short、short-to-url。

Workers範例
我們建立一個新的Workers,並到設定>變數>KV命名空間連結,將剛剛建立的兩個KV引入。


我規劃的網站有三個路徑如下:
- / :首頁,輸入網址產生縮網址
- /gen?url=XXX:產生縮網址
- /XXX:縮網址跳轉
Demo畫面如下,我們在首頁按下按鈕後,會跳到gen頁面,頁面上會產生縮網址,而且同一個網址會產生同樣的縮網址。


程式碼如下,結合之前幾篇的範例,在首頁回傳一個HTML,按下按鈕後,會觸發Javascript重新導向gen頁面,就能夠取得縮網址連結。而進入縮網址後透過302跳轉到原本的網頁。
gen_id這個function用來產生縮網址的ID,並透過遞迴的寫法檢查ID是否存在過,上面有個length的參數,可以設定縮網址的長度。
export default { async fetch(request, env, ctx) { const length = 8; async function gen_id() { let result = ""; const characters = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789"; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * characters.length)); } const find = await env["short-to-url"].get(result); if (find == null) { return result; } else { return gen_id(); } }
const { pathname, searchParams } = new URL(request.url); if (pathname == "/") { // 首頁 const html = `<!DOCTYPE html><body> <h1>縮網址</h1> <input type="text" id="url" size="70"> <button onclick="location.href='/gen?url='+encodeURIComponent(document.getElementById('url').value)">產生縮網址</button> </body>`; return new Response(html, { headers: { "content-type": "text/html;charset=UTF-8", }, }); } else if (pathname == "/gen") { // 產生短網址,檢查URL是否已經有對應ID try { const url = searchParams.get('url'); new URL(url); // test url let id = await env["url-to-short"].get(url); if (id == null) { id = await gen_id(); await env["short-to-url"].put(id, url); await env["url-to-short"].put(url, id); } return new Response("https://short-url.hchou.workers.dev/" + id); } catch (e) { return new Response("URL error"); } } else { // 縮網址跳轉,檢查ID是否存在 const id = pathname.split("/")[1]; const url = await env["short-to-url"].get(id); if (url == null) { return new Response("Not found"); } else { return Response.redirect(url, 302); } } },};到KV的後台也可以看到已經使用的縮網址。

結語
整合KV與Worker,我們就可以來開發小型的專案,部署在Worker也快速方便,不需要另外維護伺服器。