Mencipta perkhidmatan pemendek URL ialah cara terbaik untuk menyelami pembangunan tindanan penuh dengan Node.js dan MongoDB. Dalam blog ini, kami akan melalui proses membina aplikasi pemendek URL, yang membolehkan pengguna menukar URL yang panjang kepada versi yang dipendekkan dan menjejaki penggunaannya.
Untuk mengikuti tutorial ini, anda sepatutnya mempunyai:
Mula-mula, buat direktori baharu untuk projek anda dan mulakan dengan npm:
mkdir url-shortener-app cd url-shortener-app npm init -y
Seterusnya, pasang kebergantungan yang diperlukan:
npm install express mongoose cors dotenv npm install --save-dev nodemon
Buat struktur folder berikut:
url-shortener-app/ ├── controllers/ │ └── urlController.js ├── models/ │ └── urlModel.js ├── routes/ │ └── urlRoutes.js ├── .env ├── index.js ├── package.json
Dalam fail index.js, sediakan pelayan Express dan sambung ke MongoDB:
const express = require('express'); const mongoose = require('mongoose'); const urlRoutes = require('./routes/urlRoutes'); const cors = require('cors'); const app = express(); app.use(express.json()); require("dotenv").config(); const dbUser = process.env.MONGODB_USER; const dbPassword = process.env.MONGODB_PASSWORD; // Connect to MongoDB mongoose .connect( `mongodb+srv://${dbUser}:${dbPassword}@cluster0.re3ha3x.mongodb.net/url-shortener-app`, { useNewUrlParser: true, useUnifiedTopology: true } ) .then(() => { console.log("Connected to MongoDB database!"); }) .catch((error) => { console.error("Connection failed!", error); }); app.use(cors({ origin: "*", })); app.get('/', (req, res) => { res.send('Welcome to URL Shortener API'); }); app.use('/api', urlRoutes); const PORT = process.env.PORT || 5000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
Buat fail .env dalam direktori akar untuk menyimpan pembolehubah persekitaran:
MONGODB_USER=yourMongoDBUsername MONGODB_PASSWORD=yourMongoDBPassword
Dalam fail models/urlModel.js, tentukan skema untuk URL:
const mongoose = require('mongoose'); const urlSchema = new mongoose.Schema({ originalUrl: { type: String, required: true }, shortUrl: { type: String, required: true, unique: true }, clicks: { type: Number, default: 0 }, expirationDate: { type: Date }, createdAt: { type: Date, default: Date.now }, }); module.exports = mongoose.model('Url', urlSchema);
Dalam fail route/urlRoutes.js, tentukan laluan untuk API:
const express = require('express'); const { createShortUrl, redirectUrl, getUrls, getDetails, deleteUrl } = require('../controllers/urlController'); const router = express.Router(); router.post('/shorten', createShortUrl); router.get('/urls', getUrls); router.get('/:shortUrl', redirectUrl); router.get('/details/:shortUrl', getDetails); router.delete('/delete/:shortUrl', deleteUrl); module.exports = router;
Dalam fail controllers/urlController.js, laksanakan fungsi pengawal:
const Url = require('../models/urlModel'); function generateUniqueId(length) { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < length; i++) { const randomIndex = Math.floor(Math.random() * characters.length); result += characters[randomIndex]; } return result; } const createShortUrl = async (req, res) => { const { originalUrl } = req.body; const shortUrl = generateUniqueId(5); const urlRegex = new RegExp(/^(http|https):\/\/[^ "]+$/); if (!urlRegex.test(originalUrl)) return res.status(400).json('Invalid URL'); const url = await Url.findOne({ originalUrl }); if (url) { res.json(url); return; } const expirationDate = new Date(); expirationDate.setDate(expirationDate.getDate() + 7); const newUrl = new Url({ originalUrl, shortUrl, expirationDate }); await newUrl.save(); res.json(newUrl); }; const redirectUrl = async (req, res) => { const { shortUrl } = req.params; const url = await Url.findOne({ shortUrl }); if (!url || (url.expirationDate && url.expirationDate < new Date())) { res.status(404).json('URL expired or not found'); return; } url.clicks++; await url.save(); res.redirect(url.originalUrl); }; const getUrls = async (req, res) => { try { const urls = await Url.find({}).sort({ _id: -1 }); res.json(urls); } catch (error) { res.status(500).json({ message: 'Server Error' }); } }; const getDetails = async (req, res) => { try { const { shortUrl } = req.params; const url = await Url.findOne({ shortUrl }); if (url) { res.json(url); } else { res.status(404).json('URL not found'); } } catch (error) { res.status(500).json({ message: 'Server Error' }); } }; const deleteUrl = async (req, res) => { try { const { shortUrl } = req.params; await Url.findOneAndDelete({ shortUrl }); res.json('URL deleted'); } catch (error) { res.status(500).json({ message: 'Server Error' }); } }; module.exports = { createShortUrl, redirectUrl, getDetails, getUrls, deleteUrl };
Mulakan pelayan menggunakan arahan berikut:
npm run dev
Arahan ini akan memulakan pelayan anda dengan Nodemon, yang akan memulakan semula pelayan secara automatik apabila anda membuat perubahan pada kod anda.
Dalam blog ini, kami telah membina aplikasi pemendek URL yang ringkas menggunakan Node.js dan MongoDB. Aplikasi ini membolehkan pengguna memendekkan URL, menjejaki penggunaannya dan mengurusnya dengan tarikh tamat tempoh. Projek ini merupakan titik permulaan yang bagus untuk mempelajari tentang pembangunan tindanan penuh dan boleh dikembangkan dengan ciri tambahan seperti pengesahan pengguna, alias URL tersuai dan banyak lagi.
Lawati repositori GitHub untuk meneroka kod secara terperinci.
Jangan ragu untuk menyesuaikan blog mengikut keutamaan anda dan berikan lebih banyak butiran atau penjelasan jika perlu.
Atas ialah kandungan terperinci Membina Apl Pemendek URL dengan Node.js dan MongoDB. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!