如何快速搭建一个短链接服务?

╰半橙微兮° 2024-04-17 05:38 118阅读 0赞

摘要: 很简单的短链接教程。

  • 原文:十分钟实现短链接服务(Node + Express + MongoDB)
  • 作者:MudOnTire

Fundebug经授权转载,版权归原作者所有。

短链接我们或多或少都使用过,所谓短链接就是根据较长的原链接url生成一段较短的链接,访问短链接可以跳转到对应的原链接,这样做好处在于:1. url更加美观;2. 便于保存和传播;3. 某些网站内容发布有字数限制,短链接可以节约字数。

短链接实现的原理非常简单,可以概括为:

  1. 为每个原链接生成不重复的唯一短链接
  2. 将原链接和对应短链接成对保存到数据库
  3. 访问短链接时,web服务器将目标重定向到对应的原链接

根据以上思路,我们自己也可以分分钟实现一个短链接生成服务。本文示例使用 node + express + mongodb。

1. 初始化项目

(1). 安装如下依赖:

package.json:

  1. "dependencies": {
  2. "config": "^3.2.2", // 读取项目配置
  3. "express": "^4.17.1", // web服务器
  4. "mongoose": "^5.6.9", // 操作mongodb
  5. "shortid": "^2.2.14", // 生成不重复的唯一Id
  6. "valid-url": "^1.0.9" // 判断url格式是否正确
  7. }

(2). 增加项目配置:

主要用于存放MongoDB的连接字符串和短链接的base url。

config/default.json:

  1. {
  2. "mongoURI": "mongodb://localhost:27017/url-shorten-service",
  3. "baseUrl": "http://localhost:5000"
  4. }

(3). 增加MongoDB连接方法

config/db.js:

  1. const mongoose = require('mongoose');
  2. const config = require('config');
  3. const db = config.get('mongoURI');
  4. const connectDB = async () => {
  5. try {
  6. await mongoose.connect(db, {
  7. useNewUrlParser: true
  8. });
  9. console.log(`MongoDB Connected to: ${ db}`);
  10. } catch (error) {
  11. console.error(error.message);
  12. process.exit(1);
  13. }
  14. }
  15. module.exports = connectDB;

(4). 启动express:

index.js:

  1. const express = require('express');
  2. const connectDB = require('./config/db');
  3. const app = express();
  4. // 连接MongoDB
  5. connectDB();
  6. app.use(express.json({
  7. extended: false
  8. }));
  9. // 路由,稍后设置
  10. app.use('/', require('./routes/index'));
  11. app.use('/api/url', require('./routes/url'));
  12. const port = 5000;
  13. app.listen(port, () => {
  14. console.log(`Server running on port ${ port}`);
  15. });

2. 定义数据库模型

我们需要将原链接和对应短链接保存到数据库,简单起见,我们只需要保存一个短链接编码,相应的短链接可以使用base url和编码拼接而成。

models/url.js:

  1. const mongoose = require('mongoose');
  2. const urlSchema = new mongoose.Schema({
  3. urlCode: String,
  4. longUrl: String
  5. });
  6. module.exports = mongoose.model('Url', urlSchema);

3. 生成短链接编码

这是我们实现的关键一步,思路是:用户传入一个长链接,我们首先使用 valid-url 判断传入的url是否合法,不合法则返回错误,如果合法我们在数据库中搜索是否有该长链接的记录,如果有则直接返回该条记录,如果没有则生成一条新记录,并生成对应的短链接。借助于 shortId,我们可以很方便的生成一个不重复的唯一编码。

routes/url.js:

  1. const epxress = require("express");
  2. const router = epxress.Router();
  3. const validUrl = require('valid-url');
  4. const shortId = require('shortid');
  5. const config = require('config');
  6. const Url = require('../models/url');
  7. router.post('/shorten', async (req, res, next) => {
  8. const { longUrl } = req.body;
  9. if (validUrl.isUri(longUrl)) {
  10. try {
  11. let url = await Url.findOne({ longUrl });
  12. if (url) {
  13. res.json({
  14. shortUrl: `${ config.get('baseUrl')}/${ url.urlCode}`
  15. });
  16. } else {
  17. const urlCode = shortId.generate();
  18. url = new Url({
  19. longUrl,
  20. urlCode
  21. });
  22. await url.save();
  23. res.json({
  24. shortUrl: `${ config.get('baseUrl')}/${ urlCode}`
  25. });
  26. }
  27. } catch (error) {
  28. res.status(500).json('Server error');
  29. }
  30. } else {
  31. res.status(401).json('Invalid long url');
  32. }
  33. });
  34. module.exports = router;

4. 访问短链接跳转到原链接

最后一步非常简单,当用户访问我们生成的短链接时,我们根据url中的短链接编码查询到对应记录,如果存在对应记录我们使用express的res.redirect方法将访问重定向至原链接,如果不存在则返回错误。

routes/index.js

  1. const epxress = require("express");
  2. const router = epxress.Router();
  3. const Url = require('../models/url');
  4. router.get('/:code', async (req, res, next) => {
  5. try {
  6. const urlCode = req.params.code;
  7. const url = await Url.findOne({ urlCode });
  8. if (url) {
  9. // 重定向至原链接
  10. res.redirect(url.longUrl);
  11. } else {
  12. res.status(404).json("No url found");
  13. }
  14. } catch (error) {
  15. res.status(500).json("Server error");
  16. }
  17. });
  18. module.exports = router;

测试一下:

[外链图片转存失败(img-csui9OSA-1566521815709)(https://image.fundebug.com/2019-08-23-01.png)\]

访问短链接:

aHR0cHM6Ly9pbWFnZS5mdW5kZWJ1Zy5jb20vMjAxOS0wOC0yMy0wMi5naWY

这样,一个简单的短链接生成服务就完成了,往往在我们看来很神奇的技术其实背后的原理和实现很简单,希望本文对大家有所启发。

最后,推荐大家使用Fundebug,一款很好用的BUG监控工具~

本文Demo地址:https://github.com/MudOnTire/url-shortener-service

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了20亿+错误事件,付费客户有阳光保险、核桃编程、荔枝FM、掌门1对1、微脉、青团社等众多品牌企业。欢迎大家免费试用!

发表评论

表情:
评论列表 (有 0 条评论,118人围观)

还没有评论,来说两句吧...

相关阅读

    相关 如何设计一个服务

    相信很多小伙伴都使用过短链服务,但如果让你实现一个短链服务,你知道怎么实现吗?其实实现短链服务并不是很难,最主要还是需要知道一些设计思路,还需要有一些基础技术知识,例如:哈希算

    相关

                    平常当我们要发送短信,当短信里面包含链接地址的话,通常需要做一下长链接转短链接的功能,这样做就我理解有两个好处,一个是让传输的信息量更少,二个是

    相关 如何自己服务

    如何自己搭建短链接服务 短链接我们或多或少都使用过,所谓短链接就是根据较长的原链接url生成一段较短的链接,访问短链接可以跳转到对应的原链接,这样做好处在于:1. url

    相关 如何快速一个服务架构?

    微服务火了很久,但网上很少有文章能做到成熟地将技术传播出来,同时完美地照顾“初入微服务领域人员”,从 0 开始,采用通俗易懂的语言去讲解微服务架构的系列。所以,我们策划了这篇文

    相关

    早期短链接广泛应用于图片上传网站,通过缩短网址URL链接字数,达到减少代码字符串的目的。常见于网店图片分类的使用,因有字符个数限制,采用短链接可以达到外链图片的目的。自微博盛行