>웹 프론트엔드 >JS 튜토리얼 >Node.js와 MongoDB를 사용하여 URL 단축기 앱 구축

Node.js와 MongoDB를 사용하여 URL 단축기 앱 구축

WBOY
WBOY원래의
2024-07-23 17:18:34751검색

Building a URL Shortener App with Node.js and MongoDB

URL 단축 서비스를 만드는 것은 Node.js 및 MongoDB를 사용하여 풀 스택 개발을 시작하는 좋은 방법입니다. 이 블로그에서는 사용자가 긴 URL을 단축 버전으로 변환하고 사용량을 추적할 수 있는 URL 단축기 애플리케이션을 구축하는 과정을 안내합니다.

전제 조건

이 튜토리얼을 따르려면 다음이 필요합니다.

  • Node.js 설치
  • JavaScript 및 Express.js에 대한 기본 지식
  • MongoDB 데이터베이스(클라우드 솔루션에 MongoDB Atlas를 사용할 수 있음)

프로젝트 설정

1단계: 프로젝트 초기화

먼저 프로젝트에 대한 새 디렉토리를 생성하고 npm으로 초기화합니다.

mkdir url-shortener-app
cd url-shortener-app
npm init -y

2단계: 종속성 설치

다음으로 필요한 종속성을 설치합니다.

npm install express mongoose cors dotenv
npm install --save-dev nodemon

3단계: 프로젝트 구조

다음 폴더 구조를 만듭니다.

url-shortener-app/
├── controllers/
│   └── urlController.js
├── models/
│   └── urlModel.js
├── routes/
│   └── urlRoutes.js
├── .env
├── index.js
├── package.json

백엔드 구축

4단계: Express Server 설정

index.js 파일에서 Express 서버를 설정하고 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}`);
});

루트 디렉터리에 .env 파일을 생성하여 환경 변수를 저장합니다.

MONGODB_USER=yourMongoDBUsername
MONGODB_PASSWORD=yourMongoDBPassword

5단계: URL 모델 정의

models/urlModel.js 파일에서 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);

6단계: 경로 생성

routes/urlRoutes.js 파일에서 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;

7단계: 컨트롤러 구현

controllers/urlController.js 파일에서 컨트롤러 기능을 구현합니다.

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 };

애플리케이션 실행

다음 명령을 사용하여 서버를 시작합니다.

npm run dev

이 명령은 Nodemon으로 서버를 시작하며, 코드를 변경하면 서버가 자동으로 다시 시작됩니다.

결론

이 블로그에서는 Node.js와 MongoDB를 사용하여 간단한 URL 단축 애플리케이션을 구축했습니다. 이 애플리케이션을 사용하면 사용자는 URL을 단축하고, 사용량을 추적하고, 만료 날짜로 관리할 수 있습니다. 이 프로젝트는 풀 스택 개발에 대해 배우기 위한 훌륭한 출발점이며 사용자 인증, 사용자 정의 URL 별칭 등과 같은 추가 기능으로 확장될 수 있습니다.

코드 탐색

GitHub 저장소를 방문하여 코드를 자세히 살펴보세요.


원하는 대로 블로그를 맞춤설정하고 필요한 경우 자세한 내용이나 설명을 제공하세요.

위 내용은 Node.js와 MongoDB를 사용하여 URL 단축기 앱 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.