我最近每天晚上八点都在讲 nice gs, 然后帮助大家呢,从零开始学会一个 gs 的后端框架,让前段工程师呢也可以做前后端的一套应用。不过我在讲的时候啊,很多人会问我,他说 nice 的 gs 跟这个 spr 之间到底有什么区别? nice gs 呢,它是在 eceprise 基础之上进行的开发。呃,做出来的一个框架,或者简单来讲的话呢,就类似于你使用的各种安卓操作系统,它都是在原声操作系统之上进行的美化修饰,添加一些小软件,是吧,做一些好的体验。 那么 isprise 的话呢,就类似于原声的安卓应用。这个 nice 的 gs 呢,就类似于拿到你的你买的安卓手机用到的那个那个系统。对, nice 的 gs 啊,他就是站在 isprise 这个巨人肩膀之上,遥望远方。
粉丝3.1万获赞14.1万

哈喽,各位观众晚上好,今天我们来学习 note gs 的第二十九张 eq pros, 那么终于学到这个框架了,以后就再也不用使用原生 http 模块去编写我们这个外部应用程序以及 apa 接口了,因为写起来真的是太费劲了。 好,那有了 ecpress 呢,我们可以简单并且灵活的去编写我们这个 a p i, 并且呢它还提供了路由以及中间键, 那路由是干什么的?路由可以帮我们去做这个模块化的一个拆分,比如说你在 user 里边呢,只处理跟用户相关的一个逻辑,比如说在类似这模块里边呢,只处理个这个数据获取的一个逻辑,对,他可以帮我们这个进行业务逻辑的一个拆分, 并且呢它还支持我们这个浮端渲染,比如说可以配合 e g s 或者是 p u g 进行浮端渲染也是可以的。并且它还有这个强大的中间键生态系统,比如说我们像处理 这个身份验证啊,或者是日志系统啊,都可以使用中间键的去给它完成。好,那么来编写第一个我们这个 express 的 http 服务。首先我们需要先安装一下这个模块儿啊,我们通过 npm miss store 装一下 express, ok, 装完之后呢,我们一会还要演示它的中间键,所以说我们还需要装一个日志系统,就是这个 looks g s。 好,把这个一会儿装一下就可以了, 那这个的话是我提前定好一个目录结构,那这个 midwear 的话,一会儿我们来演示中间键的编写, 还有 src 的话,我是拆了两个模块,就是类似的 gs 跟 usual gs, 这两个就是我们一会拆成一个路由,然后这个 app 的 gs 就是我们这个主文件啊,我们先启动一个 http 服务啊。 首先我们需要先引入一下 express 哦,如果你想使用 input 语法的话,记得在这个 package jason 把这个 type 给它开启,开启就可以使用了。然后 express 呢?它是个函数, 对,需要,所以说需要给他调用一下,好,调用完成之后呢,去监听的端口就可以了,点 listen, ok, 那怎么去定义一个这个 get 或者是 pose 的请求呢? 对,使用 express 是非常简单的,直接通过 a p p 调它对应的方法就可以了,比如说点 get, 对,直接调对应的方法就可以了。然后第一个参数就是我们要写的这个 u i o 的一个地址,也就是路由的地址。 对,也可以称之为是一个 a p i 的地址对,比如说我们就叫做杠 get。 那第二个参数就是一个回调函数。 对,回到函数里边有这个 request 和这个 response, 那 request 就是接收前端传过来的参数, 对,接收客户端的参数,然后 response 呢,就是去给客户端返回数据,对,他们两个都是一样的 post, 他也是一样的, 对,都是一样的。当然还有些别的,比如说你是遵循了这个 rest 风格,当然还有一些别的,比如说铺车,对,它也是支持的,还有什么 pitch 或者是 the latter, 这些请求它都是支持的。对, 不过我们一般常用的还是这个 get 跟 pose 的。好,我们先给前端放点东西,别让他一直在这卡着,我们就有 sin 的一个 get 吧, 这的话我们就来个 post。 好,那这两个接口呢?我们就已经定完成了。对,是不是非常简单?对,用这玩意很简单的。然后我们来启一下服务,啊,好,服务呢,已经是启动完成了。然后我们来请求一下,首先是 get, 点击 send request, 我还发现已经是返回了,哎,没有一点问题,所以说我们的请求是没有问题的。然后我们再试一下 post。 好,我们点击 send request app, post 呢,也是读到了。对,没有什么问题。对,所以说我们可以通过这两种方式呢去定义我们这个请求。那比如说动态参数应该怎么去定义呢?好,动态参数 我们就用 get 演示吧。那比如说就是杠, get 后面还有一个动态参数。 对,这个动态参数呢?后面的名字是可以随便起的。对,冒号是固定语法,这个名字是随便起的。比如说我们后面跟一个 id。 对,我们想更加羽翼化一点。对,我们就起个 id 就可以了。 好,我们重启一下这个符。好,我们再来测试一下,它是一个 get。 对,后面就是跟一个动态的 id, 比如说九九六对,这个可以随便写,或者是零零七对,因为它是动态的,而我们再来点击一下 send the request, 哎,动态参数,对,也是可以支持的。对,没有什么问题,比如说九九六 对,没有问题。对,后面跟一个 id 就可以了。对,这个,这个名字随便起的,只是我们更加羽翼化一点,就是它这个 id。 哦,那这是接口的一个定义。那怎么去接收前端传过来的参数呢?注意,用 get 的话,我们使用 quarry iq 点 quarry 去接收前端传过来参数。 好,那 pose 它呢?是 r e q 呢? body, 对,它使用的是 body。 好,那动态参数它使用的是 iq 点 pummers 对,它使用的是这个 好,我们可以来试一下。 好,我们先测试一下这个动态参数,点击,哎,发现 id 呢,已经是读到了,只是九九六,没有什么问题,比如说我给他换一个,比如说零零七, 好,再请求一下,对值呢,也是换了,所以说我们可以使用 iq 点 partners 去获取我们这个动态参数。好,然后我们再测试一下普通的一个 get, 点击 send, 哎,也是读到了 a 和 e, b 和二,对读到了,没有什么问题,然后我们再测试一下这个 post, 点击 center request, 哎,发现读的是一个 antifan 的,对,发现 post 呢是有问题的。对,如果 post 呢,想要获取前端传过一个 jason 参数,它是需要一个中间键支持的,通过 a p p 点 use, 然后一颗 pros 点 jason 就可以了。去调一下这个方法, 对,需要支持 post 去解析 jason, 对,需要调这么一个中间键,记得把它放到上面。好,我们再试一下, 点击 sender request, 哎,此时呢,我们就可以读到前端传过来的一个参数了,对,需要这么一行代码去给他做一个支持啊。我们再回顾一下,如果接收 get 参数的话,使用 query 就可以了, 如果接收 post 传过来参数使用玻璃就可以了。并且呢,上面要支持一下这个 jason 的一个解析,如果接收动态参数,直接使用 pomers 就可以接收到了,他返回的是一个对象。 好,那这个的话就是一个接收前端传过来参数,以及我们这个 api 接口的基本定义就已经讲解完毕了。然后我们再讲一下他的另一个核心功能,就是如何去编写这个模块化,因为我们不可能把所有的接口都写到这一个文件里边,那简直真的是很难维护啊。所以说我们会把它进行这个 个模块化的一个拆分,对,我这已经拆分两个模块,比如说有个 user 模块,还有个类似的模块啊,然后我们在 user 模块呢去定一下我们这个路由。首先我们需要先引入下一个一个 price 哦,然后我们再定一个 router, 这等于一个 price, 对,去直接调这个 router 就可以了。然后再用 router 去定义我们的请求,比如说 这个 router 点 get, 对,通过 router 再去定我们的气球就可以了。我们定义成 post 吧。比如说杠 login 是一个登录逻辑,然后比如说我们想给它返回的是一个 jason, 那就 r e s 点 jason 就可以了, 这个扣的是二百 message, 是哎,登录成功,准备简单的返点东西,然后我们再创建 the registry, 好一个登录,一个注册,然后呢把这个去给它导出去就可以了。 export default, 这个 router ok, 然后我们在 list 里面也 copy 分,比如说我们就叫杠, 什么 get, 哦,就随便写一个啊, 那把它换成是一个 get, 对,获取这个数据啊,获取成功,返回一个 data, 对,随便给他翻点数据啊。 ok, 那这两个模块呢,就已经定义完成了。那定义完成之后如何去使用 呢?那需要在 apr 这一次去给他做一个引入啊。 呃, user 这儿 g s 还有个 list, ok, 目前呢就已经是引过来了。那引过来之后怎么去使用呢?引过来之后需要给他去注册一下这个中间键, 等通过 a p p 点 use。 对,第一个是这个前缀啊,第一个是前缀,比如说杠 user, 然后呢再把我们这个模块去给他注册一下就可以了, 比如说刚 list, 然后再把 list 模块呢去给它塞紧就可以了。对,这样的话就进行了我们这个 模块化的一个拆分呢,方便我们去维护这个代码以及多人开发,我们来重新启动一下。那比如说我现在想请求一下这个登录接口,我应该怎么去请求呢?我们来编写一下, 我们使用 host http 括号刚刚 local host, 首先我们需要先加上它的前缀,也就是杠 user, 为什么有一个前缀呢?就是防止重名的哦,杠 user, 然后才是真实的,我们这个请求的一个地址就是这个杠 login, 再给它拼接上这个就可以了, 然后我们再给他来个版本, 好,没有参数我们就直接请求一下就可以了。点击 send request, 那发现呢就已经请求到了,并且是返回成功了,对登录成功也是没有问题,那这个 registry 也是一样的。 对,记住加上这个前缀就可以了。后面的是还是对,对应我们这个 router 就可以了,点击 send, 对,注册成功没有问题。然后我们再试一下这个 list, list 的话是一个 get 请求, 对,它是 list 杠 get 哦,然后没有参数我们可以给它删掉,然后我们再点击 send request, 哎,发现了他这个数据呢,也是返回了,对,没有什么问题,所以说模块化拆分的时候呢,记住前面一定要加一个前缀,就是防止我们这个重名的,对,这个,这个的话就是他的 一个核心功能之一啊,就是可以进行这个 router 模块化的一个拆分。好,然后我们再演示另一个核心功能,就是我们这个中间键的一个编写。好,那么这个中间键呢?它需要导出一个函数啊,我们就 cons 它这个 made wear, 我们比如说叫 logo made wear。 对,他是需要导出一个函数,然后他会把这个函数里边呢去给我们去注册三个参数,比如说 request, 还有 response 以及 next。 对,他会给我们注册这三个参数。 there will question 还是接收这个? 对, request 还是接受我们前端传过来的数据,那 response 呢?就是返回给前端的数据。那 next 呢?对,是否是,是否要执行下一个中间键?如果不写就一直卡在这了? 对,如果不写 next 呢?它就会一直在中间这儿卡着,它就不会继续再往下走了,所以说 next 肯定要调用一下。对,它是个函数啊,对,别让它在这一直卡着。 当然比如说你想让它抛出异常,耐克斯里面也可以支持去接收一个 arrow 就不会往下走了,去抛出一个异常也是可以的。好,然后我们需要注册一下我们这个 logs gs, 就是我们这个 日式插件,我们需要引入一下。对,他有一个方法叫做 configure, 对,它里面配置项是非常多的,首先是一个 appends, 然后去资金配置,比如说我们想把这个日志呢在控制台输出, 对,控制台去输出这个日志,并且呢还有这个文件,对,也要输出。对,我们想输出两份,第一个就是控制台输出一下,然后并且呢再输出一个文件,就方便我们去查看嘛,所以我们给它订一个 alt, 然后是这个 type, 就是 s t d alt, 对,控制台先给它输出一下,还有这个 layout 输出的样式。呃, color, 就是希望它有点颜色,对,它好像是个蓝色,这是控制台输出,然后我们希望它再输出一个文件,就是 few, few name 就是 locks 下面的 server 吧。哦,然后 type type 就是 few okay, 那这样的话就定完成了,定完成之后,我们需要把它存放到一个类别里边儿,也就是这个, 然后是一个 default, 对,需要把它存放到一个类别里边儿,然后 level 的等级是 debug。 好,存放完成之后呢,我们就可以给它初始化了。 on, 获取一下这个 deflt, 对,获取一下它里边的一个类别,然后我们去调用对应的 debug 方法就可以了。点儿 debug。 对,我们可以把它的这个请求的方法以及请求的地址呢去缓存到我们这个中间键里边儿,这个中间键呢就是每一个路由呢都会经过这个中间键。 对,每一个请求呢都会经过中间键。对,每一个请求都会经过这个中间键。那就非常方便我们去记录他的一个日志信息了。好,我们来导入一下, 然后我们通过 a p p 点 use, 对,去注册一下就可以了。好,然后重新启动一下我们这个, 对,我们这个路由呢已经是注册好了。对,反正他会经过这玩意的。好,这个文件已经是帮我们去创建好了,然后我们这执行下这个接口就可以了。点击一顺的来发现呢,是不是已经打印出来了?对,并且是带颜色的。 还使用了什么方式?使用了 get 请求。请求哪个地址呢?刚 list, 刚 get to all。 我们来看一下这个日志。对,日志里边呢,也是有了。对,没有问题。然后我们再试一下别的请求啊, 试试这个点击。哎,也是没有问题。 post user 下面的 registery。 然后我们再看一下文件。啊。 对,也是记下来的。对,没有什么问题。比如说还有一些别的更关键的信息呢,你也可以记一下。对,我这的话只是给大家演示一下这个东西的一个用法。好,那以上的话就是本章所有的知识。

接下来是萨斯接口,萨斯接口使用的是萨斯总线 scsi 协议,这种接口通常来讲是服务器上用的非常多,你可以把它理解为一种强化版的萨特接口,在萨塔上增加了更多的功能,并且支持速率更高的萨斯总线。 萨斯街口还有一个特点,他就是可以一分多以满足服务器硬盘贵多硬盘的要求。由于直接是在萨塔街口上改款而来的,所以萨斯街口可以向下兼容萨塔硬盘走 ahci 协议, 但是要注意,这里是 sars 接口,兼容 sart 硬盘,而 sars 硬盘由于本身是 sars 总线和 scsi 协议,所以他只能接在支持 sars 总线上的口上用。 萨斯街口除了硬盘架上这种数据供电一体的母口之外,还有很多使用线缆接驳的各种分支形状,分支太多我就不 一一介绍了,本身也是服务器上的比较多,大家简单看一看就行。最后一个就是 u 二接口了, u 二接口的是在萨斯接口上继续改款而来,除了兼容下面的萨塔还可以兼容萨斯 还额外提供了 pcie 乘四的总线支持。这个接口也是在服务器和高端 hedg 平台上使用的比较多, 很多的企业级固态使用的都是这种接口。和萨斯一样,除了硬盘架这种一体成型的母口之外,还可以使用线揽接脖。 u 二在主板上的接口非常类似两个 usb 接口摞起来的形状,还是比较有辨识度的。 所有的硬盘和接口到这里就算介绍完毕了,这时候你再回去看这个很乱的结构图,基本上大概就明白是啥意思了。这里边有一个比较有意思的点,就是 pcie 总线的硬盘,他们之间的接口大部分都是可以互相转 转换的,比如说 pcie 可以转成 u 二, pcie 可以转成 m 二, m 二可以反过来转成 pcie mr 还可以转成 u 二, u 二反过来可以转成 m 二。所以你可以发现,接口其实并不是完全限制速率发挥的因素, 真正要判断一个硬盘所使用的接口,其速率上限以及你主板上的接口会不会限制你硬盘性能发挥,你最好是去参考一下他们所使用的总线比较好,单纯的通过协议去判断其实并不准确。 可能上面那些说的比较多,大家也不是很理解,接下来我选几个例子配合接口总线协议图讲解一下。 注意,以下分析的速率都只是硬盘的接口理论速率上限,不是实际的硬盘运行速度,实际这个硬盘能跑多快还是要看硬盘本身的设计和用料了。传统的萨塔餐机械吸不出去, 蓝盘一屉。萨特接口萨特三点零总线 ahci 协议速率上线六百兆每秒。传统的萨特三固态硬盘凯霞 tc 十萨特接口萨特三点零总线 ahci 协议速率上线六百兆每秒。 三星八六零 evo m 二版本 m 二 bm 的 mt 接口 sat 三点零总线 ahci 协议速率上限六百照每秒。 三星 sm 九五幺 ahci 版本 m 二 mc 接口 pcie 三点零乘四,总线 ahci 协议速度上线四。至于每秒 三星 xp 九四幺 m 二 mt 接口 pcie 二点零乘四,总线 nvme 协议速度上线两支臂每秒 c 部数据 sn 五百 m 二 bmt 接口 pc cia 三点零乘二,总线 nvme 协议速率上线两。支臂每秒 c 部数据, sn 七五零 m 二 mk 接口 pcae 三点零乘四,总线 nvme 协议速率上线四。支臂每秒 三星九八零 plomrmt 接口 pcie 四点零乘四,总线 nvme 协议速率上线八。支臂,每秒三星九八三 gtpcie 接口 pcie 三点零乘四,总线 nvme 协议速率上线四。支臂,每秒 英特尔九幺零 pcie 接口 pcie 二点零乘八,总线 scsi 协议速率上线四 gb 每秒细节,银河四 t 萨斯接口,萨斯三点零,总线 scsi 协议速率上线一点二 gb 每秒 英特尔 p 四五幺零 u 二接口 pce 三点零乘四,总线 nvme 协议速率上线四。至于每秒 以上的硬盘例子,再加上之前那张协议总线接口的结构图,稍微加以研究,基本上就能搞清楚一个硬盘以及他的接口最快能跑到多快了。 希望大家在看完这期节目以后,对硬盘的协议总线以及接口有一个大概的认知,将来选择硬盘的时候不会再被接口和协议迷惑。

主板上很多的接口升级其实你都用不到, ddr 五是比 ddr 四快一倍,但是 ddr 五主打的是高频量、高容量的数据程度,适用于不太要求快速响应的工业设计软件、视频音频剪辑软件。就游戏性能来说,六千频率以上 ddr 五内存才比 比较好。 pcie 四点零是比 pcie 三点零快一倍, pcie 五点零又比 pcie 四点零快一倍,但是这种速度的提升需要在拷贝完整超大文件时才能体验到,本身 pcie 三点零就已经满足日常使用的需求了,太高速的接口真 真的用不到。不过 usb 接口的升级确实实用,现在有拍摄手机,拍几张照片可能就几个 g。 升级到 usb 十 gb, 每秒一点二五 gb 的理论传输速度。听起来很香,但是价格有点贵,大部分用户 还是用的 usb 五 gb 的接口,更贵的 usb 二十 gb 跟 usb 四就是少见中的少见了。能用这种板子的都是有实力的,兄弟,你们用的都是什么主板呢?写在评论区看看实力。

很多人问我 zf express type b 卡为什么有那么夸张的写入速度这个标志? zf xpress 是由 safa 闪存卡联盟定制了一项针对可移动存储卡的标准,它写入快的原因是采用 pci 一三点零接口,可以使用一到四条通道, 每条通道的宽带是 egb 每秒,所以可达到了理论写入速度,上线是很高的。那我们平时电脑中用的 nvme 固态硬盘,规格最多的就是 pcia, 三点零乘以四, 也就是理论宽带最大为四 g b 每秒,相对于使用创行接口的 sd 卡来说,速度可以达到更高,读写延迟也会更低。 sife express 卡也有两代标准,分别是二零一七年推出的 sif express 一点零和二零一九年推出的二点零。 一点零标准采用的是固定的 pcl e, 三点零乘以二,两条通道总宽带就是固定的两 g b 每秒。二点零标准采用的是一条、两条或者四条的可变通道。 self express 针对卡的大小不同,分为了 abc 三类。我手上的是雷克萨德 sife express tabb, 优势在于体积不是特别大,但显弱的速度比 a 类快,而且还有提升的空间。 主演于未来应该使 saf express tap b 居多,现在大部分机型也是适合 saf express tap b。 saf express tap a 只有小部分机型使用 saf express tap c 尺寸太大,都是电影机级别的机子在用。关注我,了解更多知识!


为什么建议却去后的?当产品经理提出一个无理的需求,脑子一转就知道这东西到底能不能做?因为我们诺诺克里边是有去接口开发这个工作的,对你未来去进企业做项目、做产品有一个非 非常非常好的一个逻辑构造,你做产品的时候你才知道数据原来必须从前端采集,经巴塞克斯发到后端,后端处理之后再响应回前端,而且他用的是 httv 请教的,把这个概念固化在你脑子里,这样的话你后边做需求你会非常清楚到底能不能做,是一天工时还是两天工时。


在电脑里面会反复提到 pci 一、三点零、四点零,很多人都不明白这个东西到底是个什么玩意,那它到底是什么呢?我们也不知道, 其实在 cpu 和各种硬件需求交互工作时,他们之间都需要录,而 pcl 一就是录的一种,那他们有什么用呢?通常可以作为接口, 又能作为通道,作为接口时插一些显卡、独立声卡等等的外接设备。作为通道,可以通过转接协议来接驳 mr、 usb、 三点二、雷电三接口等。那 x 一、 x 十四、 x 十六又是什么意思呢?简单理解就是路道宽度显而易见,车道越多,通行越快。 ok, 回到前面, pcl 一、三点零和四点零有什么区别?还是同样的道理,三点零好比单行道,四点零就好像双向道路,效率是翻倍的,总的来说就是版本的不同了。