00:00
啊啊,那大家应该还记得我们为了一开始能够。有这个产品显示我们是做了种子区块链的,那这个相当于是我们的一开始的一个测试数据,对吧?就一开始能够写入数据,那大家还记得我们一开始的这个产品页面是怎么展示的吗?HTML我们知道,就是我们会展示一个,呃,就是去中心化的一个电商平台,然后呢,我们会把products To Buy,就是要可以去买,可以去竞拍的商品列出来,然后还有一个列表是product review list,就是说现在已经到了揭示报价这个阶段的商品全部列出来,对吧?呃,这是我们当时HTML的这个定义啊,那大家会记得我们在渲染产品的这一步。我们当时渲染是不是就只渲染了两个产品啊?大家还记得我们的这个代码里面怎么写的吗?
01:01
呃,大家如果还记得的话,应该能够想到我们当时在这个渲染这一部分是直接写死了两个product对吧?我们直接就get product1 get product2,然后把它end到这个product list上,所以当时我们其实直接哈扣把这两个这两个产品写死了,所以之前大家也会记得,我们在做测试的时候,调出来这个页面永远都只有两个两个商品对吧?而且永远都是我们在种子区块链里边写入的第一和第二个产品编号是一和二的那两个产品啊,所以这个大家就会发现我们之前其实还没有完全做完,那大家会想到,如果我们是真正的一个基于区块链的一个D的话,这一部分应该怎么改进呢?对,可能就是大家会想到就写一个for循环对吧,那这个for循环,我们是不是就应该把这个product。
02:01
里边的所有的内容全拿出来啊,那么大家回忆一下,我们在这一个合约里边1STORE,这就是我们最关键的这个主合约,对吧?这个合约里边我们去想要去拿到这个产品信息的时候,我们是去从什么地方去拿呢?我们定义了一个get product,我们要传入它的product ID。然后拿到对应的我们这里边,呃,这个product具体的这些信息,那大家就可以想到,如果我们要是不知道product ID的话,我直接一个for循环,把所有的这个便利出来的话,那大家可以想到我们是不是就要把当前所有的product。这个数据结构我们是不是得做一个便利啊,啊,但是在我们定义的数据结构里面,大家看到好像这个便利不是特别靠谱,对吧?大家会发现我们定义的数据结构里边是从address,呃,首先是从这个product ID到address到这个商家地址的一个映射,然后呢,是定义了商家地址到他上架的所有商品的一个映射,所以从我们定义的这个映射的角度来讲,好像没有办法直接便利啊,那大家再再想一下,就是如果说我们就是想要便利,大家觉得有方法吗?我们之前其实还有一个,尽管我们。
03:40
呃,大家会想到,尽管我们存的时候是按照映射的这种方式存的,但是事实上我们的product ID是不是也是顺序增长的啊,当时我们就是加进一个产品,然后就加一,对吧,Product ID就加一,那我们当时是不是还有一个计数器来着?来家回顾一下,我们当时还有一个叫做product index的东西对吧?那这个其实就代表我们当前所有的产品数量对不对?就可以认为是product的一个长度对吧,一个length。所以我们现在如果想到的话,大家可能就就已经直观想到了,我们用这个区块链上这种方式,如果查询所有产品,我们怎么实现呢?那就写一个后循环,然后呃,I等于for,开始的时候I等于零,呃,应该是I等于一,对吧,从一开始,然后我们可能要求I要小于等于我们这里的product index对吧?啊,所以是这样的一个过程把。
04:40
所有的产品编号,产品的ID全部遍历一遍,然后把每一个都拿出来,对应的这些信息就像这个get product一样,把它拿出来全返回,对不对?呃,然后我们拿到之后再一个一个把它渲染出来,对吧?嗯呃呃,对,所以这个这个问题提的非常好啊,因为我们在这里定义的时候,可能就想到了我们这里是不是本身定义的这个列表里边有一个是products To Buy,这应该是所有的商品,对吧?那下边我们定义的是不是?
05:20
我们一般情况商品不是所有的都列在上面就可以了,对吧,那你说已经竞拍完成的,你在同样的把它列在上面,好像这个就不是特别的合理,那另外呢,呃,大家可以想到我们这里如果已经竞拍了,竞拍完成的,在这个揭示报价阶段的,我们可能要单独把它列出来去做一个查询,那大家就会想到上面这一部分我们是不是应该是都在竞拍阶段的放在这里啊,那同样大家会想到我们后面其实还有很多个阶段,在揭示报价完成之后,我们是不是还有一个可以最终结束的一个阶段,就是说要生成我们那个托管合约的那个阶段,对吧?
06:01
还可以去生成托管合约,生成托管合约之后,还可以再去大家就是2/3的那个投票,对吧,要求把这个资金释放,那这些不同的阶段是不是对应的商品应该在不同的列表里边啊,那我们直接用这样的一个一个便利的查询,那就有点太简单了,对吧?所以大家就会想到我们是不是还得做一个状态的查询,状态的筛选。啊,那这个过程大家就会发现好像很复杂对吧?那一开始我们想到这个做循环,那也罢了啊,当然这个就是大家其实直观能想到纯粹的这个放循环,其实效率肯定是肯定是不太高的,对吧?特别是在区块链上,你后边的产品如果越来越多之后,每次上来之后,你把所有那些就是已经下架或者说已经结束拍卖的那些产品,从头到尾再一个一个再重新的放循环遍历一遍,这个显然是非常没有效率的啊,那即使我们不考虑性能方面的问题,我们就考虑它的查询,那如果要做状态筛选,在区块链上似乎也是很麻烦,对吧,那我们就相当于是便利,便利出来之后,每一个拿到它的对应的那一个状态,然后一个一个去判断对吧,然后我们还得是不同的查询条件来了之后,我们都得重新来做,对不对。
07:29
重新按照那个条件重新筛选,所以这个过程我们只是这么稍微一想就会发现很复杂,所以这里就是为什么我们一开始对大家会发现我们把这些东西都留下了,对吧?只是这么一个粗糙的实现,这里我们渲染产品直接就是写死了两个产品放在这儿,直到我们我把第七部分都讲完,这部分还是就这样简单的放在这里,为什么呢?因为我们考虑到这一部分可能不适合在线上来做,我们可能更希望把它能够放到线下来做一个快速的查询,那线下这个产品怎么样来做呢?呃,大家就已经想到了,就是我们之前在架构图里边给大家列出来的,对吧?呃,那就是我们另外的再起一个外服务器,然后把对应的产品信息,主要的这些信息存同步的存到猫DB里面,那我们的后台服务器。
08:29
的这个server就是去mongo里面去查询,而不是到我们的区块链上去查询了,呃,因为大家其实可以看到,呃,大家之前也学了,呃,算是学了mongo对吧,然后也又学了MYSQL,而且学了这个高阶的很多知识,大家会发现跟传统的数据库比起来,就不管是卖CQ还是mongo,我们呃,区块链如果当成数据库的话,这些我们都认为它是传统,对吧,不管它是CQ的还是no CQ的,大家会发现区块链其实它的这个作为数据库来说,它的查询效率并不高,对吧?大家还还记得就是MYQ里边直接啊,Select什么什么from,直接所有的查询条件满足筛出来了,对吧,一条命令交互就全筛出来了,那mango里边也是,大家还记得,就是我们直接DB点,然后action name,然后点find,对吧,后面可以跟那个筛选条件快RY条件,直接把对应的所有的条目就全部的筛选出来了。
09:29
啊,但是区块链里边好像没有这么容易对吧,我们会发现如果我们想要去做这样的查询的话,那是不是还得在我们的合约里边去加更多的带查询条件的这种返回呢?啊,那这个可能就会非常的麻烦,所以我们这里我们的想法是我们最好就是不要再去增加合约代码了,大家会看到啊,就是呃,前面的这一部分概述,其实就是会会再说这个,我们如果要想去加过滤器,我们如果要想去按照一定的过滤条件去筛选产品,那我们是不是可以直接加到这个合约里边的,当然是可以,但是我们出于各种各样的这种考虑,首先我们不希望代码更复杂,我们不希望数据结构更复杂,不希望合约就是给我们在调用的时候消耗更多的GA,对吧,另外一方面就是我们也希望。
10:29
合约代码能够更简单一些,因为越复杂的代码越容易出bug,这个大家肯定都深有体会,一开始我们写简单的,大家写hello word的时候,写简单合约的时候,肯定一点问题都没有对吧?那写到这样的一个产品的时候,那可能大家在试的时候就会有各种各样的问题出现了,呃,所以呃,那另外就是大家还还需要注意,就是我们为什么不把它放在合约里边呢?因为合约这个过滤逻辑过滤的条件是没办法更新的啊,大家知道我们一旦把这一个合约发布出去啊,那这个其实就是不可不可更改的,除非我们直接这个,可这个合约做一个迁移对吧,做一个升级,那那除非是这样的情况,那这个操作是比较重,这就不像我们传统的外部服务器,即使哎大家的那个客户端不升级,我的后台只要接口没变对吧,我后台直接升级一下,停下服务器重启,诶直接这个就好使了。
11:29
直接过滤条件可能就变了,就支持更多的过滤条件了,所以大家会发现在灵活性上还是区块链,就是跟我们传统的这种外部架构还是不能比,所以我们现在的解决方案是我们可以把核心的数据放到,就是交易相关的数据,大家需要去验证,需要要求它不可篡改,需要公开的这些数据放到区块链上,放在以太网上存储,而如果我们想要去查询商品的时候,我们用一个链下的备用数据库,我们用一个链下的数据库来备份我们所有的商品信息,那这样的话我们就可以实现,呃,就是同时有链上和链下两部分内容,那链上是作为我们的主数据库,它上面有我们所有的信息,完整的信息,那这一部分是不可更改的,那我们链下的这部分呢,是出于性能的优化考虑,做一个主数据库的一个背。
12:29
份,我们平常想要去查询的时候,大家可以认为它是个缓存一样的东西,对吧?啊,那我们想要去查询的时候,连上这个缓存,它查的就非踌,那如果这个缓存掉电了,这个数据库挂了,没关系,我们通过链上的这一部分不可更改的区块链,系统照样可以把它恢复出来,那这就同时又拥有了区块链这种没有单点故障对吧?所有的数据都可可恢复,不可篡改,呃,就是去中心化这样的特性也就应用起来了,所以这其实大家可以看到,我们的这种解决思路,就是要尽量的利用起区块链的优点,然后还要尽量的弥补上它的缺点,对吧?所以我们就把两部分结合在一起来用好,那么大家会想到就是我们说这个链下的数据库,它是要给链上的部分做一个备份,那这玩意儿怎么备份呢?大家可能想到就是。
13:29
他学了这个MYSQL,可能知道MYSQL里边啊,可以去配置这个主从关系,对吧?然后去做这个数据库的备份,可以做迁移,可以做数据库的拷贝,呃,那同样就是在网购里边,它也是非常容易做这样的事情的,但是在区块链上我们怎么去做备份的,大家可能想到这个区块链嘛,那我我直接起一个全节点,不就是把数据备份了一份吗?呃,我们现在要做的不是这样的备份,对吧?那我们要做的是从区块链到我们线下系统,链下系统的一个备份,那这一部分的做法怎么样实现,大家应该能想到,我们一开始给大家讲过,在合约里边可以添加事件,对吧?对,事件里边它相当于是我们整个区块链的一个日志系统,那在日志系统里边,它是可以查询我们所有的历史数据,然后可以把新发生的所有的交易全部作为一个事件来触发对应的一个。
14:29
事件的对吧?那这样的一套系统,我们其实就可以利用它来做一个数据同步,对不对,大家可以想象这样的,对吧?那我们具体的实现是什么样呢?那就是在合约里边加上一个事件,然后在我们需要去同步数据的时候,就触发那个事件,对不对?那我们同样就在链下系统,我们自己起的那个外部服务器里边去起一个事件的监听,监听器一旦合约上有了新的数据触发了这一个事件,那么我们就在我们自己的服务器里面把它捕捉到,然后把对应的数据写到猫里面,啊,这是我们监听的这一部分,同数据同步的这一部分,呃,那如果说要用户想要去做数据查询的时候,那其实就跟我们传统的应用一样了,对吧?那就是用户发起一个,呃,一个web请求,一个HTP的请求,我们这边直接把这个内容。
15:29
返回,从mango里面查出来返回就可以了,好,那么接下来大家会看到就是首先我们要做的是什么呢?首先那大家会想到我们的后台,既然要用的数据库是mongo嘛,所以肯定就是先安装mongo DB,那这里所说的mongo DB不是我们上周给大家讲过的,就是大家直接装这个mongo mongo的这一个守护进程mongo d对吧,然后起mongo的呃,Client的它的这一个客户端程序直接去做交互,不是这一块,那呃这一部分大家是已经装好的,我们这里要求的是在我们这个项目里边去装上一个叫做mongo mongoose的这样一个组件,那这个mongoose其实大家就会看到这是一个mongo相关的一个API,对吧?我们大家可以认为就像我们在呃Java或者是呃JS,或者大家这个拍PHP,任何的语言大家都有对。
16:29
用的,比方说操作MYSQL数据库对吧?都有对应的这些库,这些包直接都可以用,那同样大家可以认为我们只要安装了这样一个包,Monguose这样一个包就可以在我们的JS里边直接去调用mango了,好,那这部分我们其实上周给大家已经说了一下是吧?呃,大家应该已经装好了,所以我这里也已经装好了,所以就不再演示了,这个非常简单,大家可以按照我们课件里面这个方法,就是把它写到p Jason里边,然后n PM in install,它会直接检查拍Jason文件,把我们没有装的东西全装上,对吧?或者大家可也可以直接n PM in install on goose就可以了,对吧?我这里边给的这个例子,呃,版本是04:11点七,大家直接装最新版本应该都没有问题啊,就是直接不加版本号都是可以的,呃,大家如果这里大家注意一下,就是如果你这里是写了monguose指定了这个版本。
17:29
那n PM in store时候装的就是对应版本对吧?这个大家是知道的,好,那接下来我们要说的是我们装了这个mons之后怎么样用它呢?在JS里边到底怎么用呢?我们来讲一下这个产品定义,呃,这个产品定义是什么呢?其实就是说我们要去定义一个JS文件,这个JS文文件就是我们的JS和mongo那边交互的一个接口,大家可以简单的这么去去认为对吧,这去理解,呃可以大家认为就是像我们在其他的一些编程语言里面所谓的这个,呃呃,就就是这个数据库接口对吧?数据库操作接口这样的一些东西,好那么我们看一下这样的一个这样的一个产品定义文件是怎么样的啊,那大家会发现,首先它里边要把mongus要引入进来,对吧,Require进来,然后大家会看到这里边定义了一个mongus点。
18:29
Promise等于global promise这个主要是因为蒙顾S它的这个promise对象,呃,就是一开始的时候是没有没有去直接赋值的,所以说要求我们把全局的promise,就是JS环境里面的promise给到它里面去,给一个这个赋值,这个大家就是固定写法,当成固定写法就可以了。然后下面大家会发现我们定义了一个叫做stemmer的东西,Stemma这个东西,呃,这个可能有点不太好理解啊,大家如果要查它的英文含义的话,可能会发现它应该叫什么呢?呃,可能有这个概要框架计划,就大概有这样的一些内容,那我们把这个STEM定义出来之后,Mongoose STEM定义出来之后,大家会发现我们是要做什么呢?其实下面我们的做法其实就是要相当于是要定义一个抽象的表,对不对啊,所以大家可以认为。
19:29
这个STEM,这就是在定义一个抽象的表,那本来mongos里面的sIgMa这个对象。呃,这个这个这是一个,它是一个方法对吧?我们可以传一个参数,这个方法它是什么呢?大家可以认为它就是一个构建我们数据库对象的一个方法,而我们构建一个真正的数据库表的时候,在猫里边我们就要定义一个collection的时候,结合的时候,那大家会发现我们把对应的这个表结构的数据类型就要传进去啊,所以大家可以看到,诶,为什么要做这样的操作呢?其实如果大家之前已经用其他的一些编程语言跟这个MYSQL,呃,Mongo可能没用过,如果跟MYSQL交互过的话,大家就会发现,那一定是MYSQL那边已经定义好数据结构了,对吧?那我们在自己的这个编程语言这边,是不是也得对应出定义出它的那个对象结构啊,对,所以其实这个大家就是想到这是一一对应的关系,我们在JS里边要操作mongo,那mongo那边已经定义好数据结构了。
20:36
我们JS这边也得把对应的数据结构定义出来,然后才能操作,我们才能拿到对应的东西,放到对应的地方,对吧?啊,所以大家这个已经有这样经验的话就好理解了,所以大家看到里面定义的是什么呢?呃,Bnching ID,然后name categoryy,然后这个IPFS什么哈希对吧?然后这个竞拍的起始时间,结束时间,Price就是起拍价格对吧?Condition还有status,别的都都还好说,前面这个block的ID是什么?这是我们一开始那个起思恋的时候的那个network ID吗?这应该不是,对吧?大家会看到这里叫blocking ID,其实对应在我们的这个存储产品的数据结构里边,是不是就是就应该是他的那个ID啊,对吧?他为什么叫了一个blocking ID呢?不直接叫ID呢?呃,大家可能回忆一下啊,我们。
21:36
对,Mongo里面是不是本来就定义出ID来了,对,所以这里边其实就是为了稍微区别一下,就是这不是mango里面的ID,这里是要记录我们在区块链上的那个ID,对吧?所以他专门说了一个blocking ID,大家不要理解错了,理解成了我们当时的那个network ID啊啊,这是说在区块链上blocking上面这个产品的ID,好,那那么现在我们大家就已经都梳理好了,对吧?那接下来大家会看到最后他还做了一个什么呢?就是定义了一个叫做product model的东西,那这个东西其实这就是我们真正的在JS里边的这个mongo,对应这个表格,或者说这个集合的对象,对吧?大家看到我们后边就调用了这个mongo mongoose的Mo model方法,然后把前面的这个STEM传进来,然后前面这是什么呢?这是一个字符串,那就是给它定义了一个名字对不对。
22:37
他这个名字叫做model啊,所以是这样一个东西啊,好,那么我们就在我们的这个项目里面,把这个来做一个实现吧,好。我这里。那大家会想到我们肯定是在外边去实现对吧,最外边直接定义一个,诶,我怎么还是在这个contract下边,我们点一下这里啊,定义一个叫做product.js的一个一个文件,好,那么这个文件就相当于是我们的产品定义,Mango里面的产品定义,那么大家就还是一起敲一下,就把我们这个刚才在课件里面看到这一部分再实现一下,看一下它的过程啊,首先往故s require对吧,那这是要把蒙古斯要。
23:37
要引入进来,然后之后我们要用,那首先大家还记得我们有一个mongoose.promise promise对吧,这个对象,我们要把全局的对象先付给他,这个他自己还没有好,前面是一个基本的引入和定义,然后下面我们就要定义真正的这个表结构了,对吧?我们JS里边和mongo相对应的这个表结构,那首先我们先把这个,呃,STEM这个先定义出来啊。
24:08
这个我们简单写,要不然Mo固点stemma这个太太长了,好,定义了stemma之后,我们就可以定义product,呃,SMA对吧?Product SMA等于new,一个S里边我们要传入一个对象,一个JS对象对吧?那这样一个对象里边的内容是什么呢?啊,我们这里的定义是一开始是一个叫block block number,诶,Block chain ID对吧?Block chain ID就它是一个number类型,所以大家会看到后边的话,其实是它的数据类型,直接就是我们JS里面对应的那个数据类型对吧?好,那么后边就是大家都知道常规的这个name,我们把它定义出来是一个string,然后category。
25:09
对对吧,这也是一个string,接下来应该还有我直接从这里copy一下啊叫IP FS image hush对吧,IP FS image hush,这应该也是一个string,我们的那个哈希的字符串,那同样这就应该还有一个叫做IP FS Dis对吧,同样它也是一个string,这个就都,其实这个大家都。这种操作我们直接把它copy过来吧,没有什么需要一步一步讲的,这个必要啊。呃,大家会看到,这就是把我们产品定义里边所有的数据全部用过来,竞拍的起始时间,结束时间,起拍价格,然后产品的这个状态就是新品还是二手货,对吧?然后还有最后啊,这个是产品的这个应该说它的这个状况,然后最后是它的这个产品状态,就是是不是在竞拍的状态下,还是说已经卖出去了,最后大家注意,我们写一个product,这就不是STEM了啊,我们定义一个product model,等于mongoose.model这个应该是小写啊,然后我们定义的这个方法是什么呢?定义一个名字叫product model,然后后边给。
26:40
STEM传进来啊,然后大家注意我们这里定义的这个product产品定义文件,我们并不是直接要执行它,而是肯定是在别的文件里边要引入它,对吧?呃,肯定是我们在这个主程序里边要去引入,所以说我们最后肯定要写一个export对吧?啊,那当然大家习惯可以用我们这个课件里面的写法,大家会发现课件里面是用这个module.exs对吧?这是我们在这个node里边引入一个文文件的习惯写法,module.export等于product model,这就是我们前面定义好的,好,所以大家可以看到就是,呃,这就是我们整个的产品定义,其实也非常简单啊,好,那么这部分讲完,大家先把它定义好,这个具体怎么用,我们等一下再看,好,那接下来呢,有了这一个。
27:40
和mongo这边的交互的产品定义,那接下来呢,就会想到我们还要起一个自己的web server,对吧?起一个服务器呢?那这个服务器我们用什么样的东西呢?来起呢?我们这里要用的是express express它是一个什么东西呢?它就是一个非常简单的基于JS的外框架,呃,那它简单到什么程度呢?呃,我们给大家就是把这个例子跑一下,大家其实就一看就看到了啊,它它简单的就这么几行就能起一个外服务器,大家还记得我们一开始是自己用node去手写对吧?引入它的HTP模块,然后去手写了一个服务器,那那个相对来讲还有点复杂,那现在大家如果当时大家觉得那个很麻烦,而且没搞懂的话,那现在我们终于有这个服务器了,对吧?有这个现成的框架,我们直接用这么几行就可以启动了,那在启动之前呢,首先大家会发现我们。
28:40
还是一样,要么express安装上对吧,N PM in store express就可以,或者大家把它写到Jason里边,然后n PM in install,另外这里还要在装一个叫做呃,Node Mo的这样的一个组件,那这是一个什么东西呢?大家可以认为它就是一个node的扩展程序,它主要的用途是做什么的?这个库它主要就是它会监控我们当前。
29:10
呃,Note服务器它的对应的这个文件内容,我们平常大家可能想到,如果说我们要起一个note服务器的话,一旦改了文件里边的内容,那我们一定是要把它停掉,然后再重启,对吧?啊,这肯定是一个常规的操作啊,那如这个no忘这这是它有一个什么样的功能呢?那就是避免了这些麻烦,我们可以让它进行热替换,相当于它又给我们包了一层,就像wiped的热启动一样,对吧?呃,就是热热替换一样,我们直接改代码,改完了之后不用重启,直接就可以应用到服务器上去啊,所以这个就会对于我们做测试会非常非常的方便,非常非常有用,对吧?所以大家可以把这个装上,当然大家如果不喜欢用它的话,不装也行,这个没关系啊,啊,就是no帽,当然这个最好我们装的时候装在这个,呃,DV dependences下面,也就是大家如果要是n PM in store的时候NPM。
30:10
高T的时候加上杠杠CD对吧?呃,就是这个我们在真正产品打包的时候肯定是不需要的,呃,这这不属于我们真正必须的一部分内容,好,那么接下来我们就来看一下这个server怎么样去实现,呃,这个server大家会发现非常非常简单对吧?所以我们就在这里跟大家一起这个跑一下就可以了,好,我们再建一个叫做server.js的一个文件啊,那这个文件里边我们既然是用express去启发,那肯定一一上来,就是先把express require进来对吧?Express好,引入这个express之后呢,那大家看一下它这个用express的一个基本的写法啊,就是一般情况会把因为express它本身xport这个组件。
31:10
哎,这个库本身export出来的,这这个东西呢?啊,它是一个方法啊,所以我们一般情况还要单独再把它定义出来,所以就是我们会定义,比方说定义一个APP APP press,然后调用这个函数对吧?调用这个方法,然后我们把这个APP定义出来,然后定义出来之后大家就会发现这个APP就相当于是我们的一个htp server,那它的用法怎么用呢?大家看我们可以直接app.listen这是什么意思呢?这就代表我们启动本地的一个端口去监听对吧?那比方说我们启动就像我们例子里面一样啊,启动一个3000端口,然后定义一个回调,这个回调里边显示的是什么呢?
32:07
啊,大家可以直观的认为就是说这个回调里面,就是我们整个这个server启动之后,会显示在我们的控制台上面的那一个信息啊,等一下大家一看就知道了啊,我们先在这里先打一条吧,就是点对吧,呃,这个比方说就是serve serve start。我们随便写一个listening port3000对吧?好,那么我们启动这个服务器之后,大家会想到,那我们怎么样去访问这个服务器呢?啊,那肯定就是我们直接在浏览器里边啊,Logo host的3000对吧?端口,那大家注意,我们这里是不是根本就没有定义服务器这边的返回啊,这里只是起起了一个服务器,然后开启了这个端口监听对吧。
33:17
那我们真正要返回给这个我们的访问页面,返回内容的时候怎么写呢?那其实很简单啊,大家会看到一个APP get,这表示什么呢?这就表示我们发来的这个get请求,HTP的get请求,然后它的路由是什么呢?路由就是啊,就是默认的这个根目录对吧?一个斜杠什么都没有的时候,我们就返回对应的信息,返回什么呢?这个写法跟我们之前在note里边用HTP方式直接写的方式其实也是类似的,对吧?他写的用这个回调的方式来写,回调有两个参数,一个叫做request,一个叫做response,对吧,一个叫req,一个叫res request,那大家会想到这其实就是可以定义我们这里request定义的一些头啊,定义的一些这这些要求,对吧?那我们这里要返回的页面会写在哪里呢?那肯定就会写。
34:17
点在response里面对不对,Res,那我们这里调用一个res.send就可以直接把要发送的内容,要写的内容直接传递到啊前端去,好,那么我们这里去写一个,比方说就写一个hello word吧,啊,我们hello e贝吧,对吧,必备好,我们把它保存一下,然后呃,我们可以启动一个,大家会想到我们现在就可以去直接启动了,对不对啊,这个好像真的没有没有把它看到啊好,我们来到这个目录下边,我可能需要先看一下这个,果然我从这边新创建的文件再看到有问题对吧?对。
35:17
没权限对吧,666应该够了啊。呃,还有一个叫server对吧?好,我们先把这两个先更改掉它的这个访问权限,然后大家会想到我们要启启动的时候怎么启动呢?那简单的一个方式大家肯定知道,就是我直接noe就可以,对吧?这是最简单的一个方式,直接node sorry,好,大家会发现这里是不是就输出了一句话,这个是不是就是我们前面回调里边listening回调里边传入的这句话,好那么接下来我们既然已经启动了,是不是就可以去访问了?好,那么我们直接访问local host3000端口,对吧?
36:15
那大家会看到是不是我们在这一个页面上直接就能显示出来我们当时rest点散的那句话啊,呃,大家当然如果要是想去写一个HTML页面的话,其实也是可以在里面去写的,对吧?大家可以把那个更更丰富的内容填到里面,当然这个就是大家可以自己去试啊,那我们这里边给大家介绍的,大家看到呃,在这个课件里边不是直接用noe方式去起,就是note server这样去起的,那是怎么起的呢?我们用了note Mo那个组件对吧?那要起的时候,如果大家没有把这个对应的就是在这个note module下面的点并文件加到这个环境变量里面的话,那我们还得去这样去访问,对吧?然后我们调用能吗?呃,它自动安装之后就生成了这个命令的,所以这就跟GALA一样,对吧,我们之前GALA是不是也这么访问过,然后加上这个S。
37:16
就可以了,那大家会看到它启动的时候稍微信息多一点,对吧?啊,它会显示当前的这个note bound的版本,然后它还会有一些这些警告,或者是一些这些信息,Starting我们的这个命令,大家会发现它本身的这个底层命令是什么呢?是不是也就是node server.js啊,所以它其实就是在note上面包了一层啊,大家就是想用的话,我们用这种方式,不用的话就是也没关系啊。
我来说两句