当前位置: 首页 > 后端技术 > Node.js

十分钟实现短链接服务(Node+Express+MongoDB)

时间:2023-04-03 11:10:18 Node.js

我们或多或少用过短链接。所谓短链接就是在较长的原始链接url的基础上生成较短的链接。访问短链接可以跳转到对应的原链接。这样做的好处是:1、url更漂亮;2、易于保存和传播;3、有些网站发布内容有字数限制,短链接可以节省字数。短链接的实现原理很简单,可以概括为:为每个原始链接生成一个唯一的短链接,将原始链接和对应的短链接成对存储在数据库中,访问短链接时,web服务器会将目标重定向到对应的原始链接根据以上思路,我们也可以分分钟实现一个短链接生成服务。本文示例使用node+express+mongodb。1.初始化项目(1)。安装以下依赖项:package.json:"dependencies":{"config":"^3.2.2",//读取项目配置"express":"^4.17.1",//webserver"mongoose":"^5.6.9",//操作mongodb"shortid":"^2.2.14",//生成唯一不重复的Id"valid-url":"^1.0.9"//判断是否为url格式是正确的}(2)。添加项目配置:主要用于存放MongoDB的连接字符串和短链接的baseurl。配置/default.json:{“mongoURI”:“mongodb://localhost:27017/url-shorten-service”,“baseUrl”:“http://localhost:5000”}(3)。添加MongoDB连接方式config/db.js:constmongoose=require('mongoose');constconfig=require('配置');constdb=config.get('mongoURI');constconnectDB=async()=>{try{awaitmongoose.connect(db,{useNewUrlParser:true});console.log(`MongoDB连接到:${db}`);}catch(error){console.error(error.message);进程.exit(1);}}module.exports=connectDB;(4).启动express:index.js:constexpress=require('express');constconnectDB=require('./config/db');constapp=express();//连接到MongoDBconnectDB();app.use(express.json({extended:false}));//路由,稍后设置app.use('/',require('./routes/index'));app.use('/api/url',require('./routes/url'));constport=5000;app.listen(port,()=>{console.log(`服务器运行在端口${端口}`);});2.定义数据库模型我们需要将原始链接和对应的短链接保存到数据库中。为了简单起见,我们只需要保存一个短链接代码,对应的短链接可以使用baseurl和编码拼接到models/url.js中:constmongoose=require('mongoose');consturlSchema=newmongoose.Schema({urlCode:String,longUrl:String});module.exports=mongoose.model('Url',urlSchema);3.生成短链接编码这是我们实现的关键一步。思路是:用户传入一个长链接,我们先用valid-url判断传入的url是否合法,如果不合法则返回错误合法的,我们去数据库中查找是否有记录长链接。如果有,则直接返回记录。如果没有,则会生成一条新记录,并生成相应的短链接。借助shortId,我们可以轻松生成不重复的唯一码。routes/url.js:constepxress=require("express");constrouter=epxress.Router();constvalidUrl=require('有效url');constshortId=require('shortid');constconfig=require('config');constUrl=require('../models/url');router.post('/shorten',async(req,res,next)=>{const{longUrl}=req.body;if(validUrl.isUri(longUrl)){try{leturl=awaitUrl.findOne({longUrl});if(url){res.json({shortUrl:`${config.get('baseUrl')}/${url.urlCode}`});}else{consturlCode=shortId.generate();url=newUrl({longUrl,urlCode});awaiturl.save();res.json({shortUrl:`${config.get('baseUrl')}/${urlCode}`});}}catch(error){res.status(500).json('Servererror');}}else{res.status(401).json('无效的长url');}});module.exports=router;4.访问短链接跳转到原链接。最后一步非常简单。当用户访问我们生成的短链接时,我们会使用url对应记录中的短链接代码查询,如果有对应的记录,我们使用express的res.redirect方法将访问重定向到原链接,如果不存在,则返回错误routes/index.jsconstepxress=require("express");constrouter=epxress.Router();constUrl=require('../models/url');router.get('/:code',async(req,res,next)=>{try{consturlCode=req.params.code;consturl=awaitUrl.findOne({urlCode});if(url){//重定向到原始链接res.redirect(url.longUrl);}else{res.status(404).json("Nourlfound");}}catch(error){res.status(500).json("Servererror");}});module.exports=router;测试一下:访问短链接:这样一个简单的短链接生成服务是的,这个在我们看来往往很神奇的技术背后的原理和实现其实非常简单。希望这篇文章能对你有所启发。最后推荐大家使用Fundebug,一款非常好用的BUG监控工具~本文Demo地址:https://github.com/MudOnTire/...