iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Nodejs+Nest如何实现的短链接服务
  • 471
分享到

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

2023-06-14 23:06:19 471人浏览 独家记忆
摘要

小编给大家分享一下nodejs+Nest如何实现的短链接服务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!日常生活中能见到各种奇怪的短链接,每次点击跳转的时候,笔者都会觉得神奇,这短链是怎么将用户引导到正确页面的呢?短链原

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

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

短链原理

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

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

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

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

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

短链服务会截取链接上的pathname,并将其当做key,到映射关系中查找对应的value。

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

具体实现

原料: Fast-Nest脚手架、Redis

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

① 接收长链接

@Post('/createUrl')async createUrl(    @Body('url') url: string,    @Body('type') type: string,) {    const shortUrl = await this.shorturlService.createUrl(url, type);    return {        shortUrl,    };}

在服务中创建一个createUrl接口,接收url已经type字段,并将其传入shorturlService中,等待短链接生成然后输出。

② 生成shorTKEy

async createUrl(url: string, type: string = 'nORMal') {    const urlKey = await this.handleUrlKey();    const dataStr = JSON.stringify({        url,        type    });    await this.client.set(urlKey, dataStr, type === 'permanent' ? -1 : 300);    return `${Config.defaultHost}/${urlKey}`;}private async handleUrlKey(count?: number): Promise<string> {    const _count = count || 1;    const maxCount = Config.maxRetryTimes;    if (_count >= maxCount) throw new HttpException('超过重试次数,请重新生成链接', 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位随机字符串,这个将会作为短链的pathname。

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

除了urlcreateUrl方法还接受一个type字段,这里涉及特殊短链的特性。我们短链有三种模式:

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

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

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

生成urlKey之后,将会与type一起转成字符串储存到Redis中,并输出拼接好的短链接。

③ 接收短链接并完成目标重定向

@Get('/:key')@Redirect(Config.defaultIndex, 302)async getUrl(        @Param('key') key: string,    ) {    if (key) {        const url = await this.shorturlService.getUrl(key);        return {            url        }    }}// this.shorturlService.getUrlasync getUrl(k: string) {    const dataStr = await this.client.get(k);    if (!dataStr) return;    const { url, type } = jsON.parse(dataStr);    if (type === 'once') {        await this.client.del(k);    }    return url;}

用户侧会获得一个类似http://localhost:8000/s/ku6a的链接,点击之后相当于是给短链接服务发送了一个GET请求。

服务接收到请求之后获取链接中key字段的值,也就是ku6a这个字符串,利用它查找Redis中的映射关系。

这里有两个分支,一个是在Redis中无法查询到相关的值,服务则认为短链接已经失效会直接return,因为getUrl返回了空值,重定向装饰器会将本次请求重定向到默认的目标链接中。

如果在Redis中顺利查到相关的值,则会读取其中的urltype字段,如果type为once则代表这个是一次性链接,会主动触发删除方法,最终都会返回目标链接。

额外功能

利用日志系统输出报表

使用短链接时,大概率都会需要相关的数据统计,怎么样在不使用数据库的前提下进行数据统计呢?

在本服务中,我们可以通过对落地日志文件的扫描,完成当日短链访问的报表。

在生成短链接的时候加上urlID字段进行统计区分并主动输出日志,如下:

async createUrl(url: string, type: string = 'normal') {    const urlKey = await this.handleUrlKey();    const urlID = UUID.genV4().toString();    const dataStr = JSON.stringify({        urlID,        url,        type    });    this.myLogger.log(`createUrl**${urlID}`, 'createUrl', false);    await this.client.set(urlKey, dataStr, type === 'permanent' ? -1 : 300);    return `${Config.defaultHost}/${urlKey}`;}

然后在用户点击短链接时获取该短链接的urlID字段,并主动输出日志,如下:

async getUrl(k: string) {    const dataStr = await this.client.get(k);    if (!dataStr) return;    const { url, type, urlID } = JSON.parse(dataStr);    if (type === 'once') {        await this.client.del(k);    }    this.myLogger.log(`getUrl**${urlID}`, 'getUrl', false);    return url;}

这么一来我们将能够在服务的logs目录中获得类似这样的日志:

2021-04-25 22:31:03.306INFO[11999][-]createUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:38.323INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:39.399INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:40.281INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:40.997INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:41.977INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:42.870INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:43.716INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf2021-04-25 22:31:44.614INFO[11999][-]getUrl**3f577625-474a-4e30-9933-e469ce3b0dcf

之后我们只需要以createUrl的日志为索引,对getUrl类型的日志进行计数,即可完成链接与点击数的报表,如果还需要其他维度的报表只需要在输出日志的时候带上即可,或者修改日志中间件中的日志范式。

使用方式

根据上述的流程,笔者写了一个比较简易的短链服务,大家可以开箱即用。

shorturl(欢迎大家Star⭐️⭐️)

具体启动方式

首先请确保有可用的redis,否则无法顺利启动服务。

git clone https://GitHub.com/mykurisu/shorturl.gitcd shorturlnpm installnpm start

可用配置修改

与短链相关的配置收束在根目录的config.ts中。

serverConfig: {    port: 8000,},redis: {    port: 6379,    host: '0.0.0.0',    db: 0,},cacheType: 'redis',defaultHost: 'http://localhost:8000/s',defaultIndex: 'http://localhost:8000/defaultIndex',
配置默认值配置用途
serverConfig.port8000服务启动端口
redis.port6379redis端口
redis.host0.0.0.0redis服务地址
redis.db0redis具体储存库表
cacheTyperedis短链储存模式,接受memory/redis
maxRetryTimes5生成短链接最大重试次数
defaultHosthttp://localhost:8000/s短链接前缀
defaultIndexhttp://localhost:8000/defaultIndex短链接失效后重定向地址

内置接口

接口路由请求方式接口参数接口用途
/s/createUrlPOSTurl: string, type?: string短链接生成接口
/s/deleteUrlPOSTk: string删除短链接接口
/s/:keyGETnone目标链接获取

拓展

① 储存降级策略

shorturl是有本地储存方案的,也就是说我们是可以监听Redis的状态,如果断开连接时就临时将数据储存到内存中,以达到服务降级的目的。当然我们也可以直接使用内存来储存短链内容,在config.ts配置中可以进行更改。

② 不仅仅是短链接服务

让我们脱离短链接这个束缚,其实shorturl本身已经是一个微型存储服务了,我们完全可以进行二次开发,输出更多的模块以支撑更多样的业务。

看完了这篇文章,相信你对“nodejs+Nest如何实现的短链接服务”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Nodejs+Nest如何实现的短链接服务

本文链接: https://www.lsjlt.com/news/275584.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Nodejs+Nest如何实现的短链接服务
    小编给大家分享一下Nodejs+Nest如何实现的短链接服务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!日常生活中能见到各种奇怪的短链接,每次点击跳转的时候,笔者都会觉得神奇,这短链是怎么将用户引导到正确页面的呢?短链原...
    99+
    2023-06-14
  • PHP如何实现短链接生成
    这篇文章主要介绍了PHP如何实现短链接生成,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php版的短链接生成方法<phpfunction shorturl($...
    99+
    2023-06-02
  • 微信域名链接防封短链接是如何生成的,微信域名防封短链接代码实现示例
    本文由猴子数据专业微信域名防封编写最近发现很多客户在微信域名防封的时候是用防封短链接进行推广的,而且这样的客户都有动态参数的需求,而且需求量非常大。主要集中在代理模式的淘客、分享平台,或者一些正规QP游戏行业,那今天就给大家介绍下使用系统,...
    99+
    2023-06-04
  • 如何利用新浪官方的短网址API接口实现T.cn短链接的压缩生成
    短网址的实现原理就是有一个数据表会配置文件将短网址和实际网址进行对应,当请求某个短网址时,程序跳转到对应的实际网址上去,从而实现网址的访问。目前国内最稳定最好用的是新浪T.cn短链接。之前新浪提供了长链接转为短链接的API,可以把长链接转为...
    99+
    2023-06-03
  • nodejs连接dubbo服务的java工程实现示例
    目录前言1.启动dubbo提供服务2.新建node测试文件nodeTest.js3.下载所需依赖4.启动服务 前言 最近公司整体服务架构从MQ迁移到dubbo上,公司有部分项目使用了...
    99+
    2022-11-13
  • nodejs如何实现邮件发送服务
    这篇文章将为大家详细讲解有关nodejs如何实现邮件发送服务,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前段时间,想用python实现发送邮件的服务,用的是smtp,但...
    99+
    2022-10-19
  • 如何做云服务器的网页链接
    对于开发者而言,云服务器可以提供快速开发、部署和管理应用程序的便利。通过云服务器,开发者可以将应用程序和数据存储在云端,从而实现快速开发和部署应用程序的目标。此外,云服务器还可以提供安全性和可靠性的保障,例如数据加密和备份、容灾备份等措施。...
    99+
    2023-10-28
    如何做 链接 服务器
  • 云centos开启docker远程服务链接的实现步骤
    这里介绍的是已经安装好docker的centos服务器上,开启远程链接服务,这样方便我们用IDEA远程链接,可以一键打包成镜像到测试服务器上(当然我们可能是自己玩,或者在测试服务器上...
    99+
    2022-11-12
  • css如何实现样式为默认的链接
    这篇文章将为大家详细讲解有关css如何实现样式为默认的链接,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。样式“默认”链接说到链接样式,您可以在几乎每个样式表中找到一个通用的A样式。这迫使您为子元素中的任何...
    99+
    2023-06-27
  • 如何做云服务器的网页链接教程
    以下是一个简单的教程,教您如何制作云服务器的网页链接: 打开 Windows 操作系统中的 Ms Player 程序,然后在终端中打开 Apache Web 服务器。 在 Apache Web 服务器中创建一个新的 HTTP 请求并将其...
    99+
    2023-10-26
    如何做 链接 服务器
  • 如何使用nodeJS实现一个mock数据服务器
    这篇文章主要介绍如何使用nodeJS实现一个mock数据服务器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对于前端开发者而言,javascript正扮演着越来越重要的地位,它不仅能...
    99+
    2022-10-19
  • 手机如何链接云服务器设备上的网络连接
    现在,我们来看一下如何使用手机连接云服务器设备上的网络。首先,我们需要下载并安装一个云服务器管理器。在手机上找到设置,通常会在这里找到云服务器的选项。然后,点击“登录”按钮,输入您的云服务器账号和密码,并确认您的手机已经登录。登录成功后,您...
    99+
    2023-10-28
    链接 服务器 设备
  • 轻松创建nodejs服务器(8):非阻塞是如何实现的
    这节我们来了解一下nodejs实现非阻塞操作的方法。 我们先来修改一下 start的处理程序: var exec = require("child_process").exec; function st...
    99+
    2022-06-04
    如何实现 轻松 服务器
  • 手机如何链接云服务器设备上的数据
    如果您想在手机上链接云服务器设备上的数据,您需要确保您的设备已经连接到了云服务器,然后打开并且连接成功。这可能需要一些时间来实现,但只有在确保您已经成功连接云服务器并且云服务器已正确加载了您的数据之后,您才能够使用手机上的浏览器或应用程序来...
    99+
    2023-10-26
    链接 服务器 数据
  • 手机如何链接云服务器设备上的网络
    如果您想在手机上链接云服务器设备上的网络,您可以按照以下步骤操作: 1.打开您的智能手机,并搜索您的云服务提供商的网络支持选项。 2.进入云服务提供商的应用程序或设置页面,以查找并启用网络支持选项。 3.在网络设置中,选择“网络配置”选项...
    99+
    2023-10-26
    链接 服务器 设备
  • nodejs如何实现TCP服务器端和客户端聊天功能
    这篇文章主要介绍了nodejs如何实现TCP服务器端和客户端聊天功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:服务器端var&...
    99+
    2022-10-19
  • 微服务如何实现服务之间的接口协同工作?
    随着互联网产业的快速发展,越来越多的企业开始采用微服务架构,以适应快速变化的市场需求。微服务架构的一个特点就是将一个大型应用程序拆分成多个小型服务,每个服务都能独立部署、运行和维护。但是,由于每个服务都是相互独立的,因此这些服务之间需要相互...
    99+
    2023-05-17
    微服务 实现 接口协同
  • 如何实现不刷新网页就能链接新的js文件
    这篇文章给大家分享的是有关如何实现不刷新网页就能链接新的js文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何不刷新网页就能链接新的js文件,其实在HTML语言中已经有相关的...
    99+
    2022-10-19
  • 手机如何链接云服务器设备上的数据传输
    首先,手机连接云服务器设备需要先准备好一个云服务器软件,如AWS、阿里云等。然后,打开手机上的浏览器,搜索云服务器软件,并下载安装到手机上。安装完毕后,打开云服务器软件,输入云服务器的IP地址,如10.0.0.1(根据手机的系统版本不同,I...
    99+
    2023-10-28
    数据传输 链接 服务器
  • 手机如何链接云服务器设备上的网络设置
    一、连接手机到云服务器设备 首先,在手机中安装相应的云服务器APP,如谷歌云盘、WPS云等。 打开云盘APP,点击上传按钮,上传手机中的文件。 接下来,点击上传按钮,输入文件名,确认上传。 上传完成后,云服务器APP会提示保存成功。 接...
    99+
    2023-10-28
    链接 服务器 设备
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作