如何在 Deno 中构建一个 URL 短链生成器

如何在 Deno 中构建一个 URL 短链生成器

作者|韩亦乐责编|欧阳姝黎
原文地址:HowtoBuildaURLShortenerinDeno
原文作者:AkashJoshi
译者:hylerrix
备注:本文遵循freeCodeCamp翻译规范,同时本文会收录在《Deno钻研之术》的翻译篇中。
Deno是用Rust编写的一个全新JavaScript和TypeScript运行时。它提供了严格的安全性、开箱即用的TypeScript、一个单个可运行的执行文件,以及一组经过代码审查的标准模块。
像Node.js下的npm一样,Deno的生态库被管理在X中心库下。我们将使用其中的一个库——Oak,在Deno中构建基于RESTAPI的服务器。
通过使用类似Express的路由管理库Oak的基础知识后,我们将深入探讨Deno并构建一个完整的应用程序。
这是我们将构建此应用程序的步骤:
使用基于JSON的配置文件来将URL短链映射到端口上
在每个URL上附加有效期,以便这些重定向仅在有效的时间内生效。
从这个链接中安装Deno。
确保你知道一些JavaScript基础。
尽管并不是本文所需,但你还是可以通过以下视频的形式看看Deno的基础介绍。
一个Deno入手的视频教程。
那么,让我们来正式开始?
要为我们的应用编写服务端代码,我们将使用Oak模块。它具有类似于Express定义API路由的语法。
如果我们在这个文档中,“基础用法”部分几乎涵盖了我们会在本文中用到的一切路由。因此,我们直接拓展这段代码来构建我们的应用。
要直接用到这段代码,可以在文件夹中创建一个名为index.ts的文件,然后将“基本用法”里的代码复制到其中。
要了解如何在Deno中运行TypeScript或JavaScript文件,你首先需要理解Deno是如何运行文件的。
你可以通过运行denorunfile_name.ts或file_name.js命令来运行文件,后面可以跟一组参数标志,这些标志将为你的应用程序提供某些系统权限。
为了测试刚刚粘贴的“基础用法”代码能否跑通,使用如下命令:denorunindex.ts。
你会看到Deno警示你没有授予该代码访问网络的权限。所以你需要添加-allow-net到刚才的run命令中。该命令最终会像这样:denorunindex.ts-allow-net。
“基础用法”中的路由代码会如下所示:
拆解上面的代码:首先定义了一个router对象,然后在路由器上调用get函数,以定义应用程序的各种端口。端口相应的逻辑在回调函数中定义。
例如,对于”/”端口,已定义了在响应体重返回“HelloWorld”的回调函数。我们可以先保持此端口不变,以通过接收响应来测试我们的应用程序服务器是否正在运行。
我们不需要已定义的“/book”URL,因此可以安全地删除其定义。此时,你的路由应具有如下结构:
在下一节中,我们将着手于开始实战构建应用程序。
现在让我们开始实战构建URL短链生成器。
它应该根据shortcode来重定向到目的地(dest)。重定向还应仅在有效期到期之前有效,可以以年-月-日格式提供。
基于这些假设,让我们创建一个名为urls.json的配置文件。该文件的格式为:
你可以参考这个JSON文件。
要在你的代码中读取这个JSON文件,请在index.ts顶部添加以下内容:
现在,要运行index.ts,你需要另一个标志-allow-read,否则Deno将抛出“未提供读取权限”错误。你的最终命令应该是denorun—allow-net—allow-readindex.ts。
运行此命令后,你将在终端窗口中看到打印的JSON文件。这意味着你的程序能够正确读取JSON文件。
如果我们回到上面看到的“基本用法”示例,则路由“/book/:id”风格正是我们接下来所需要的。
将”/book/:id”替换为”/shrt/:urlid”,此时我们将基于URLID(:urlid)获得各个URL。
用以下代码替换”/book/:id”路由中存在的现有代码:
路由中的if条件执行以下操作:
检查参数是否存在于路由中
检查参数urlid是否在参数列表中
检查urlid是否与我们JSON中的任何URL匹配。
如果有所匹配,用户将重定向到正确的URL。如果无所匹配,则返回404响应。
想要测试这段代码,请将如下代码复制到index.ts中。路由现在长这个样子:
接下来使用denorun—allow-net—allow-readindex.ts运行文件。
如果你从示例中复制了JSON文件,此时打开http://localhost:8000/shrt/g,你会正常重定向到Google主页上。
另一方面,如果你使用的随机shortcode在我们网址配置中不起作用,则会进入到404页面上。
但是,你会看到我们的短链器不会实时响应JSON文件中的变更。想要增加更多的配置,请以如下相同格式向urls.json中添加新的重定向。
这是因为urls.json仅在刚开始时被读取一次。现在,我们需要将实时更新功能添加到服务端上。
为了使urls对象能够实时响应JSON文件中的更改,我们只需将read语句移动到路由中即可。会长这样:
请注意我们如何是路由内部移动URL对象的。此时,每次调用该路由时都会读取配置文件,因此它可以实时响应urls.json文件中所做的任何更改。即使我们现在添加或删除其他重定向,我们的代码也会做出新的响应。
为了使我们的URL在某个时间点上过期,我们将使用流行的Moment.js库,该库使处理日期变得更容器。
幸运的是,它已经被良好移植到了Deno上。要了解其工作原理,请在上一句的链接中查看其文档。
要在代码中使用到,请直接通过URL导入:
为了检查URL什么时候过期,我们检查urls对象上的expiryDate键值。如下所示:
在moment.format(“YYYY-MM-DD”)中,我们使用moment来获取当前的时间。然后使用.format(“YYYY-MM-DD”)将其格式化为”YYYY-MM-DD”(年-月-日)格式。
通过将其与我们的expiryDate键进行比较,我们可以检查当前的URL是否已过期。
就是这样!你已经在Deno中构建了功能齐全的URL短链器。你可以在这个Github库中找打最终的代码。
通过将expiryDate设置为当前日期并对urls.json和我们的代码进行其它更改可以测试更多功能。
为了总结这篇文章,我将谈谈我对deno.land的思考。
当看到一种考虑安全性并支持TypeScript的服务端运行时令人耳目一新,但Deno在应用到生产环境之前还有很长的路要走。
例如,即使对于像我们刚开发的那样简单的程序,使用TypeScript编译也得需要约为20秒的时间,这非常的慢。
在错误报告方面,描述错误的地方还很糟糕。比如,当在函数本身中嵌入代码以读取urls.json时,Deno无法报告未设置-allow-read标志。相反,它只会引发内部错误,而不会在终端上打印正确的错误。
译者注:现Deno1.9版本已经很好地支持权限提示了,其它的也在逐步支持中。
你可以通过构建更复杂的应用程序(比如聊天应用程序或Wikipedia克隆版)来提高你的Deno或TypeScript的技能。
你也可以浏览deno.land上的Deno文档,来更熟悉基础知识。
感谢你阅读本文,祝你编程愉快!
Deno
-https://deno.landDenoX(仓库中心)
-https://deno.land/x/Oak(REST框架)
-https://deno.land/x/oakOak基础用法
-https://deno.land/x/oak@v6.3.1#basic-usage最终的GitHub仓库
-https://github.com/akash-joshi/deno-url-shortener
https://github.com/hylerrix/deno-tutorial2020~2021
生于2001年的《程序员》曾陪伴了无数开发者成长,影响了一代又一代的中国技术人。时隔20年,《新程序员》带着全球技术大师深邃思考、优秀开发者技术创造等深度内容回来了!同时将全方位为所有开发者呈现国内外核心技术生态体系全景图。扫描下方小程序码即可立即订阅!

主题测试文章,只做测试使用。发布者:最新稳定辅助网,转转请注明出处:https://www.744broad.com/14045.html

(0)
上一篇 2023年3月4日 上午2:11
下一篇 2023年3月4日 上午2:15

相关推荐

  • 「干货」filecoin的互操作到底什么意思,它能对挖矿有什么好处?

    「干货」filecoin的互操作到底什么意思,它能对挖矿有什么好处? 互操作本次的第二阶段测试,有一个特别重要的特点容易被忽略,那就是“实现go-filecoin和louts之间交互性操作”,乍一看,也就是个程序上的更新,没什么大不了的。但是事实并非如此,这种交互操作,对filecoin的运行甚至矿工挖矿都有重大意义!互操作系统是什么?不同平台或编程语言之间…

    RUST资讯 2023年2月14日
    90
  • 防锈添加剂 RPA4800

    防锈添加剂 RPA4800 防锈添加剂RPA4800产品描述:RUST-XRPA4800防锈添加剂是一款可溶于水的防锈产品,可根据金属件所需要的防锈期进行添加,添加比例为0.5%-5%(1:200-1:20)。RPA4800可用来做水压试验,可加入到循环冷却水、锅炉、热交换器、切削油箱或其他水系统中从而避免金属设备被水锈蚀。此添加剂还可以加入到暂停使用或备用…

    RUST资讯 2023年2月25日
    70
  • 质量工具—顾客金字塔模型

    质量工具—顾客金字塔模型 客户是企业最为宝贵的资源,如何有效的挖掘客户信息、对客户实施差异化管理、合理分配企业的有限资源成为每个企业面临的现实问题。顾客金字塔模型是一种有效的手段。顾客金字塔模型是美国营销学者隋塞莫尔(ValarieA.Zeithaml)、勒斯特(RolandT.Rust)和兰蒙(KatherineN.Lemon)提出的一种顾客差异化管理模型…

    RUST资讯 2023年3月11日
    30
  • 全球区块链1.31:虚拟货币投资者在2018年的损失是上一年的3.6倍

    全球区块链1.31:虚拟货币投资者在2018年的损失是上一年的3.6倍 欢迎关注【全球区块链早餐】(bc_daily),区块链大事早知道,美好的一天从信仰开始!点击播放音频版,释放手眼,和早餐更配哦!二级市场NEWS据jp.cointelegraph消息,虚拟货币投资者在2018年损失的虚拟货币为17亿美元(约合1850亿日元),损失金额是2017年的3.6…

  • 《自然》(20220804出版)一周论文导读

    《自然》(20220804出版)一周论文导读 编译|冯维维Nature,4AUG2022,Volume608,Issue7921《自然》2022年8月4日,第608卷,7921期物理学PhysicsQuantizedcurrentstepsduetothea.c.coherentquantumphase-slipeffect由交流相干量子相滑移效应引起的量子…

    RUST资讯 2023年2月14日
    80
  • 最强陆地越野车!传说中的奔驰乌尼莫克为何能卖到300万?

    最强陆地越野车!传说中的奔驰乌尼莫克为何能卖到300万? 【卡车之家原创】说起奔驰,不少卡友会想起G级越野车、阿克托斯牵引车等等车型,不过有这么一辆车,常常是只闻其名,不见其身,它在国内的状态就像神龙见首不见尾那样神秘,而它也是汽车圈、卡车圈、专用车圈、越野圈的资深老炮,它就是奔驰的乌尼莫克。第一代乌尼莫克乌尼莫克的历史远比奔驰G级的历史更加久远,在1942…

    RUST资讯 2023年3月12日
    30
  • 与艺术对话,国际大牌年末再掀融合新风尚

    与艺术对话,国际大牌年末再掀融合新风尚 奢侈品牌与艺术领域开展对话合作,被认为是一种分享品牌文化、体现品牌理念的高级手段。近日,红星新闻记者观察到,临近年末,各大品牌与艺术领域的合作主题也在合作思维、方式和规模上进行大胆的创越,着重突出不同领域之间的交融以及作品,强调参与者的感官感受,借此营造出更美好的视觉体验和深层次的情感共鸣。“历史与当下——艺术的时代性…

    RUST资讯 2023年3月10日
    30
  • 来酒店屋顶滑雪吗?

    来酒店屋顶滑雪吗? HteldesHorlogers滑雪酒店于近日正式营业,该酒店位于风景优美的瑞士侏罗山谷,源于自然,融于自然,项目周边是浑然天成的景观视野,如同安逸的避世之所。项目是由BIG与CCHE建筑事务所合作设计,酒店占地约6503㎡,约50间客房、两间餐厅、一间酒吧、一间水疗中心和一间会议中心等,一并都朝向山谷以便充分享受山谷一览无余的景观和自然…

  • 我讲一个梅毒的故事,一个关于医患之间相互信任治愈梅毒的故事

    我讲一个梅毒的故事,一个关于医患之间相互信任治愈梅毒的故事 这个故事似乎很简单,就是一个四五十岁的农民工大叔找我看病的事儿,但看完后值得深思。患者来就诊的时候,有些难为情的和我说,找男医生看病比较方便,找女医生不方便。我一问才知道他是包皮破了,有点不舒服。我让他脱下裤子,在阴茎根部看到典型的一期梅毒硬下疳的皮疹:一块钱币大小的浅表溃疡面,看起来潮乎乎的,但他…

  • 环球图片一周精选

    环球图片一周精选 当地时间2016年1月16日,土耳其哈塔伊,一名叙利亚难民宝宝坐在帐篷外的空地上哭泣。AA/东方IC当地时间2016年2月19日,英国伦敦,伦敦时装周开幕,善待动物组织(PETA)成员戴防毒面具躶体示威,抗议使用皮草。NilsJorgensen/东方IC当地时间2016年2月15日,智利圣地亚哥,选手们参加2016MissReef选美大赛。…

    RUST资讯 2023年2月27日
    40
关注微信