Nodejs +巢如何实现的短链接服务

  介绍

小编给大家分享一下Nodejs +巢如何实现的短链接服务,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

日常生活中能见到各种奇怪的短链接,每次点击跳转的时候,笔者都会觉得神奇,这短链是怎么将用户引导到正确页面的呢?

短链原理

<强>短链的原理就是以短博长强,那么这个短的字符串怎么才能变成一长串链接呢?难道是靠某些神奇的加密算法?并不是,我们只需要依赖键/值的映射关系就能轻松实现这个看似神奇的<强>以短博长

用一张图,大家就能清晰的看到我们访问短链的整个过程了。

 Nodejs +巢如何实现的短链接服务

首先,我们会有一个长链接,通过短链服务的处理,通常会输出一个只有一层目录的URL,然后我们可以将获取的URL进行分发。

然后就到了用户侧,用户点击短链之后,先到达的并不是目标页面,而是短链服务。

短链服务会截取链接上的路径名,并将其当做钥匙,到映射关系中查找对应的价值。

如果查到不到对应的价值,则表示这个短链不存在或者已失效,如果查询成功,则会由短链服务直接302到中值的目标链接,完成一次短链访问。

具体实现

原料:Fast-Nest脚手架,复述,

整个实现分拆成3个部分:

①接收长链接 @Post (& # 39;/createUrl& # 39;   async  createUrl (   ,,,@Body (& # 39; url # 39;), url:,字符串,   ,,,@Body(& # 39;类型# 39;),类型:,字符串,   ),{   ,,,const  shortUrl =, await  this.shorturlService.createUrl (url,类型);   ,,,return  {   ,,,,,,,shortUrl,   ,,,};   }

在服务中创建一个<代码> createUrl 接口,接收<代码> url> 类型字段,并将其传入<代码> shorturlService> ②生成shortKey async  createUrl (url:字符串,类型:,string =, & # 39;正常# 39;),{   ,,,const  urlKey =, await  this.handleUrlKey ();   ,,,const  dataStr =, JSON.stringify ({   ,,,,,,,网址,   ,,,,,,,的类型   ,,,});   ,,,await  this.client.set (urlKey, dataStr,, type ===, & # 39;永久# 39;,?,1,:,300);   ,,,return “$ {Config.defaultHost}/$ {urlKey} ';   }      private  async  handleUrlKey(算数?:号码):,Promise, {   ,,,const  _count =, count  | |, 1;   ,,,const  maxCount =, Config.maxRetryTimes;   ,,,if  (_count 祝辞=,maxCount), throw  new  textbox(& # 39;超过重试次数,请重新生成链接& # 39;,,HttpStatus.INTERNAL_SERVER_ERROR);   ,,,const  urlKey:, string =, math . random () .toString (36) .slice (4);   ,,,const  _url =, await  this.client.get (urlKey);   ,,,if  (_url), {   ,,,,,,,return  await  this.handleUrlKey (_count  +, 1);   ,,,}   ,,,return  urlKey;   }

首先通过<代码> math . random () .toString (36) .slice(4) 获取4位随机字符串,这个将会作为短链的路径名。

在进行映射之前,我们需要对其进行唯一性判断,虽然出现的可能性不大,但是还是需要防范短链覆盖这类的问题。本服务的解决方案是重试生成,如果短链值不幸重复时将会进入重试分支,服务将会内置可重试次数,如果重试的次数超过配置的字数,本次转换将会返回失败。

除了url <代码> ,<代码> createUrl 方法还接受一个<代码> 类型字段,这里涉及特殊短链的特性。我们短链有三种模式:

<李>

正常-普通短链接,将会在规定时间内失效

<李>

一次——一次性短链接,将会在规定时间内失效,被访问后自动失效

<李>

永久-长期短链接,不会自动失效,只接受手动删除

生成<代码> urlKey 之后,将会与<代码> 一类型起转成字符串储存到复述中,并输出拼接好的短链接。

③接收短链接并完成目标重定向 @ get(& # 39;/:关键# 39;)   @Redirect (Config.defaultIndex, 302)   async  getUrl (   ,,,,,,,@Param(& # 39;关键# 39;),关键:,字符串,   ,,,),{   ,,,if (关键),{   ,,,,,,,const  url =, await  this.shorturlService.getUrl(关键);   ,,,,,,,return  {   ,,,,,,,,,,,的url   ,,,,,,,}   ,,,}   }//this.shorturlService.getUrl   async  getUrl (k:字符串),{   ,,,const  dataStr =, await  this.client.get (k);   ,,,if  (! dataStr),返回;   ,,,const  {url的不同之处是,type },=, JSON.parse (dataStr);   ,,,if  (type ===, & # 39;一旦# 39;),{   ,,,,,,,await  this.client.del (k);   ,,,}   ,,,return  url;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Nodejs +巢如何实现的短链接服务