1. 程式人生 > 其它 >Node短鏈原理與功能實現總結

Node短鏈原理與功能實現總結

導語:有時候我們經常在微博或者某些營銷簡訊中看見非常短小的網址,當你開啟它在遊覽器檢視時,發現跳轉到了一個非常長的網址,這其實就是用到了短網址的服務。今天,我就簡單的做一個總結,結合我之前開發的一個短鏈工具進行經驗知識總結。

目錄

  • 原理說明
  • 方法實現
  • 實戰演練

原理說明

短網址,又叫短鏈,也就是一個非常短的網址,由域名加唯一id字母或數字字元混合組成,大概不超過10位數。

短網址建立

短網址建立方法如下:

  • 獲取引數網址;
  • 查詢是否存在,存在返回短網址,不存在建立短網址;
  • 訪問短網址時候,查詢資料庫原網址作302;

短網址展示

短網址從開啟到展現網頁,中間經過以下步驟:

  • 開啟短網址後請求短網址伺服器;
  • 根據唯一id讀取資料庫原站網址;
  • 進行302重定向到原站網址;

中間可能會統計訪問者資訊(IP,裝置資訊等),用來收集訪問資料,便於決策;

短網址作用

使用短網址的好處有以下幾個方面:

  • 短網址比起一大段長長的網址來說,看起來很舒服;
  • 短網址容易節省空間和資料庫容量;
  • 短網址比較安全,避免黑客直接攻擊原站,減小DDOS,CC攻擊;

方法實現

建表

使用命令列連線mysql,然後建立一張short表。

mysql -h 127.0.0.1 -P 3306 -u demo -p
mysql> use demo;
Database changed
mysql> show tables;
+----------------+
| Tables_in_demo |
+----------------+
| goods          |
| user           |
+----------------+
3 rows in set (0.00 sec)
mysql> CREATE TABLE `short` (
  `id` int(11) NOT NULL COMMENT 'id',
  `sid` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '短鏈碼',
  `url` varchar(1046) NOT NULL COMMENT '網址',
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='短網址';
mysql> ALTER TABLE `short` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id';
mysql> ALTER TABLE `short` ADD PRIMARY KEY(`id`);

方法編寫

首先,先安裝一個npm包,然後使用包的str10To64以及shortId方法,生成短鏈識別碼

db方法,前幾篇已經介紹過,不會的請返回前面文章檢視

npm install xquuid
  • 建立短網址
const express = require('express');
const app = express();
const db = require('../model/simple');
const xqsql = require('xqsql');
const xquuid = require('xquuid');

app.post('/s', async (req, res) => {
    let baseUrl = 'http://127.0.0.1:3000/s/';
    let userId = 10;
    let url = req.body.url;
    let urlReg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;
    
    if (!url) {
        return res.json({
            code: 101,
            msg: 'get_fail',
            data: {
                info: "網址不能為空!",
            }
        })
    }

    if (!(urlReg.test(url))) {
        return res.json({
            code: 101,
            msg: 'get_fail',
            data: {
                info: "網址格式錯誤!",
            }
        })
    }
    
    let getSql = xqsql.get('short', {
        type: 'one',
        key: 'url',
        ids: [url],
    }, 'default', 'id,url,sid');
    let getSqlResult = await db(getSql);
    if (getSqlResult.code == 200 &&
    getSqlResult.data.list.length == 0) {
        
        let sid = xquuid.str10To64(xquuid.shortId(userId));
        let shortUrl = `${baseUrl}${sid}`;

        let addParams = [
            {
                sid,
                url
            }
        ]
        let addFields = [
            {
                name: '短網址',
                value: 'sid',
                isMust: true
            },
            {
                name: '原網址',
                value: 'url',
                isMust: true
            },
        ]

        let addSql = xqsql.add('short', addParams, addFields);
        let addSqlResult = await db(addSql);
        if (addSqlResult.code == 200) {
            return res.json({
                code: 200,
                msg: 'get_succ',
                data: {
                    info: "建立成功!",
                    url: shortUrl
                }
            });
        } else {
            return res.json(addSqlResult);
        }

    } else {
        return res.json({
            code: 101,
            msg: 'get_fail',
            data: {
                info: "網址已存在!",
                url: `${baseUrl}${getSqlResult.data.list[0].sid}`
            }
        })
    }

})
  • 訪問短網址
// 訪問短鏈
app.get('/s/:sid', async (req, res) => {
    
    let sid = req.params.sid;

    if (!sid) {
        return res.json({
            code: 101,
            msg: 'get_fail',
            data: {
                info: "短連結不能為空!",
            }
        })
    }
    
    let getSql = xqsql.get('short', {
        type: 'one',
        key: 'sid',
        ids: [sid],
    }, 'default', 'id,url');
    let getSqlResult = await db(getSql);
    if (getSqlResult.code == 200 &&
    getSqlResult.data.list.length) {
        let url = getSqlResult.data.list[0].url;
        res.redirect(url);
    } else {
        return res.json({
            code: 101,
            msg: 'get_fail',
            data: {
                info: "短網址不存在!"
            }
        })
    }
})

實戰演練

長網址尋找

這裡在網上找到兩個:

http://www.51yuansu.com/sc/vsvhhktgav.html

https://baijiahao.baidu.com/s?id=1704505053721054995&wfr=spider&for=pc

https://mp.weixin.qq.com/s?src=11&timestamp=1625549401&ver=3173&signature=N5D9x59A5A1rhcpac3ujtOEu51niWlSwkna6186uwcvDZl2reuDxNFwv8fQOfOtLuV5XRQkJ6xSVAfWR5lpsSwDRpA3y6CIPLGT5xW21OL2BvJxsA*TvCwkEeX4v1SWr&new=1

postman建立

  • 首先開啟postman,輸入一個長網址,傳送請求後得到如下內容:


訪問短網址

複製生成的短鏈進行訪問

基本上的演示就到這裡了,如果你覺得想要更短的網址,那你可以購買一個域名,解析到這個node伺服器上面來。

比如:url.me,然後買一臺伺服器,解析一下,使用nginx配置一下反向代理。

upstream shortSite {
  server 127.0.0.1:3000 weight=1;
}

server {
  listen 80;
  server_name url.me;
  location / {
    proxy_pass http://shortSite/s/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

這樣再試著訪問一下上面的網址http://url.me/13mm

可以看到確實好看多了。

好了,短鏈的知識就介紹到這裡,如果有發現問題的,及時提問。