یک کوتاه کننده 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 403
–key
ارائه شده در حال حاضر وجود دارد -
HTTP 403
–hash
یا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 without a key
POST http://localhost:3000/shorten
content-type: application/json
{
"url": "http://google.com"
}
### GET existing URL
GET http://localhost:3000/google
### GET non-existent URL
GET http://localhost:3000/googlenonexistent
7. ایده های توسعه پذیری:
- اجازه دهید چندین URL به طور همزمان کوتاه شوند
- آن را با یک ربات Discord ترکیب کنید تا URL های کوتاه شده کاربران را در چت ارسال کنید
- با توقف سرور یک نسخه پشتیبان از هش ها و URL ها ایجاد کنید و در هنگام راه اندازی بازیابی کنید
- مجموعه آزمایشی کامل یعنی JEST یا MOCHA را اضافه کنید
نتیجه
ما مراحل ایجاد یک نسخه اولیه از سرویس کوتاه کننده URL، نحوه نزدیک شدن به طراحی، تقسیم کار به نقاط پایانی و تصمیم گیری در مورد ساختار داده را طی کردیم، و یک نقطه شروع عالی برای موارد استفاده تخصصی تر ایجاد کردیم.
لطفاً نظر خود را در مورد این مقاله به من بگویید زیرا این اولین مقاله من است! خیلی ساده است؟ خیلی کوتاه؟ با ارزش؟ برای مهندسان جدید خوب است؟
چه چیز دیگری در آینده جالب خواهد بود:
- گسترش این پروژه؟
- ایجاد کلون هایی از Leetcode یا Youtube یا Twitter..
- تمرکز بر مشکلات واقعی Leetcode
- ایده های بهبود برنامه نویسی React، microservices؟
- کار طراحی سیستم؟
از هر گونه بازخوردی در این مراحل اولیه نوشتن مقاله من قدردانی می شود!