برنامه نویسی

یک کوتاه کننده URL در Node.js بسازید!

مقدمه

من به شما نشان خواهم داد که چگونه یک کوتاه کننده URL اصلی ساده و کارآمد در Node.js با Express.js ایجاد کنید – این یک پروژه شخصی عالی برای یادگیری است که به راحتی قابل انطباق و گسترش است.

کد کامل: https://github.com/kacperturon/urlshortener

پیش نیازها:

پروژه Node جدید ایجاد کنید npm init -y Express.js را نصب کنید npm i express اسکریپت “شروع” را به package.json به اسکریپت ها اضافه کنید start: "node index.js"

اختیاری:


1. سرور و 2 نقطه پایانی را راه اندازی کنید

app.post('/shorten', (req, res) => { 
  const { url, key } = req.body;
  ...
}
app.get('/:hash', (req, res) => {
  const { hash } = req.params;
  ...
}
app.listen(port, () => console.log(`Server: URL shortener started on port ${port}`));
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


2. کمک کننده ایجاد کنید

  • یک هش با طول مشخص ایجاد کنید:
const getRandomHash = (len) => crypto.createHash('shake256', { outputLength: len }).update(crypto.randomBytes(20).toString('hex')).digest('hex');
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • محاسبه مقدار ترکیبات ممکن 26 [a-z] + 10 [0-9] ^ len + 1 (getRandomHash بر حسب بایت است بنابراین 1 اضافه می کنیم):
const possibleHashCombinations = (len) => (26 + 10) ** (len + 1);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


3. ساختار داده را برای پیگیری URL های کوتاه شده طراحی کنید

const hashes = new Set();
const urlHashes = {};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

داده های نمونه:

Set(5) { 'google', 'a3', '76', '60', 'cc' }
{ 'http://google.com': [ 'google', 'a3', '76', '60', 'cc' ],
  'https://dev.to/: [ 'ge', 'dev' ] }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

رویکرد جایگزین: به جای اینکه کلید نشانی اینترنتی باشد، کلید هش باشد، این امر به میزان زیادی بر استفاده از حافظه ما تأثیر می گذارد، اما عملکرد را نیز به میزان زیادی افزایش می دهد.


4. دو نقطه پایانی طراحی کنید

  • پست /shorten – URL دریافتی را با یک کلید یا با ایجاد یک هش تصادفی کوتاه کنید

هش ایجاد کنید تا زمانی که یکی منحصر بفرد باشد یا زمان اجرا پس از 10 ثانیه تمام شود:

setTimeout(() => { halt = true; }, 1000 * 10);
do {
    hash = getRandomHash(hashLength);
    if (halt) return res.sendStatus(500);
} while (hashes.has(hash) || hash === null);
hashes.add(hash);
urlHashes[url] = urlHashes[url] ? [...urlHashes[url], hash] : [hash];
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

رویکرد جایگزین: در هنگام راه اندازی سرور، هش ها را از قبل تولید کنید و بلافاصله اولین هش رایگان را برگردانید.

اگر تمام ترکیبات مصرف شوند، مقدار را افزایش دهید hashLength و دوباره محاسبه کنید:

combinationsAvailable -= 1;
if (combinationsAvailable === 0) {
    hashLength += 1;
    combinationsAvailable = possibleHashCombinations(hashLength);
}
return res.send(`${domain}/${hash}`);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • گرفتن /:hash – URL کوتاه شده را بازیابی و تغییر مسیر دهید
  const url = Object.keys(urlHashes).find((u) => urlHashes[u].includes(hash));
  return res.redirect(url);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


5. با لبه‌ها برخورد کنید

/shorten

  • HTTP 403 – هیچ URL ارائه نشده است
  • HTTP 403key ارائه شده در حال حاضر وجود دارد
  • HTTP 403hash یا key درحال حاضر وجود دارد
  • HTTP 500 – در هنگام ایجاد یک منحصر به فرد، زمان تمام شد hash

/:hash

  • HTTP 404 – URL برای هش وجود ندارد

6. نقاط پایانی را تست کنید

### POST with a specified key
POST http://localhost:3000/shorten
content-type: application/json

{
    "url": "http://google.com",
    "key": "google"
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

POST با کلید مشخص شده

### POST without a key
POST http://localhost:3000/shorten
content-type: application/json

{
    "url": "http://google.com"
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پست بدون کلید

### GET existing URL
GET http://localhost:3000/google
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دریافت URL موجود - پاسخ جزئی

### GET non-existent URL
GET http://localhost:3000/googlenonexistent
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دریافت URL ناموجود


7. ایده های توسعه پذیری:

  • اجازه دهید چندین URL به طور همزمان کوتاه شوند
  • آن را با یک ربات Discord ترکیب کنید تا URL های کوتاه شده کاربران را در چت ارسال کنید
  • با توقف سرور یک نسخه پشتیبان از هش ها و URL ها ایجاد کنید و در هنگام راه اندازی بازیابی کنید
  • مجموعه آزمایشی کامل یعنی JEST یا MOCHA را اضافه کنید

نتیجه

ما مراحل ایجاد یک نسخه اولیه از سرویس کوتاه کننده URL، نحوه نزدیک شدن به طراحی، تقسیم کار به نقاط پایانی و تصمیم گیری در مورد ساختار داده را طی کردیم، و یک نقطه شروع عالی برای موارد استفاده تخصصی تر ایجاد کردیم.



لطفاً نظر خود را در مورد این مقاله به من بگویید زیرا این اولین مقاله من است! خیلی ساده است؟ خیلی کوتاه؟ با ارزش؟ برای مهندسان جدید خوب است؟

چه چیز دیگری در آینده جالب خواهد بود:

  • گسترش این پروژه؟
  • ایجاد کلون هایی از Leetcode یا Youtube یا Twitter..
  • تمرکز بر مشکلات واقعی Leetcode
  • ایده های بهبود برنامه نویسی React، microservices؟
  • کار طراحی سیستم؟

از هر گونه بازخوردی در این مراحل اولیه نوشتن مقاله من قدردانی می شود!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا