首页 > web前端 > js教程 > 正文

使用 Node.js 和 MongoDB 构建 URL 缩短应用程序

WBOY
发布: 2024-07-23 17:18:34
原创
717 人浏览过

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
登录后复制

第三步:项目结构

创建以下文件夹结构:

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

构建后端

第 4 步:设置 Express 服务器

在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 启动您的服务器,当您更改代码时,Nodemon 会自动重新启动服务器。

结论

在本博客中,我们使用 Node.js 和 MongoDB 构建了一个简单的 URL 缩短器应用程序。该应用程序允许用户缩短 URL、跟踪其使用情况并通过到期日期进行管理。该项目是学习全栈开发的一个很好的起点,并且可以通过用户身份验证、自定义 URL 别名等其他功能进行扩展。

探索代码

访问 GitHub 存储库以详细探索代码。


您可以根据自己的喜好随意定制博客,并在需要时提供更多详细信息或解释。

以上是使用 Node.js 和 MongoDB 构建 URL 缩短应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!