00:00
大家会想到接下来我们是不是最后要实现的就是这个save product方法了,Save save product方法同样还是一个function,对吧?Same product。呃,大家首先会想到我们这里边传进来的对象应该是一个什么呢?是不是就应该应该还得传一个参数对吧?这里我们是把result.arguments传进来的,大家会想到我们要save这个product,是不是传参的时候就应该把这个商品的对象传进来啊?所以这里其实我们传进来的就是一个product对象,好,就是这里的result.argue其实就是一个product对象好,那么接下来我们就要去做这样的一个事情。大家会发现我们要去把这一个product存到mango上的话,那是不是我们就要跟mango,呃,Mango做交互了,对吧?跟mango做交互的我们的东西是什么,是哪个东西呢?
01:11
呃,定义了一个一直没有用的东西,叫做product model,对吧?啊,这是我们真正要去做这个交互的时候用的这个东西,好,那么大家可以看一下我们怎么样去做交互啊,做交互的写法是product model,这就是我们定义的这一个model对象,对吧?我们的产品的数据结构,产品的那个表数据结构,那他怎么样去用呢?这个modelgo是不是就相当于我们跟我们的collection一样啊?所以大家会想到我们在mango的命令行里面不是可以直接DB,然后加上点name,然后点find吗?所以这里我们可以直接product model.find。
02:04
那这里我们用另外一个方法,大家可以看到这里面都有这个定义,对吧,后面都已经自动补全了,可以find,也可以find by ID,也可以find by ID and delete,或者我们这里用一个find one find one是什么意思呢?啊,就是满足条件的查询,只查出第一条就可以了,对吧?我们这里是想干什么呢?是我们这里想要存这个产品,那我们是不是应该先看一下对应的那个ID有没有啊,如果有的话,我们是不是就不要存了,因为我们前面的这个查询其实是可以把所有的历史数据都查出来的,对吧?你每次都去存一遍,这个就没必要了,对不对?所以我们这里去find one先去查一下。如果说里边能够找到对应的这个ID的产品的话,那我们就不存了,对吧,那如果说我们要是。
03:02
啊,没有找到这样的产品的话,就把它真正的存进去好,那么接下来大家看一下后边我们做的这个操作啊,Find one,大家会想到find one的话,里边跟的参数应该是什么,第一个参数是不是就应该是,但是不是能想到,这就跟我们在mango的那个命令行里面的参操操作的参数应该一样吧。是不是应该先传入一个查询条件,开始条件对不对,所以这里就是我们要查哪个字段对吧?大家想我们要查哪个字段呢?是不是要查那个ID啊,这里的ID是我们在mango里边定义的ID,我们mango里面定义的ID叫什么呢?对,叫block chain ID对吧?这个大家不要搞错,所以是block chain ID,然后它要等于哪个呢?
04:01
啊,大家会想到是不是product这里边会传进来啊,Product里边会传入什么东西呢?大家回忆一下我们的new product这里面要传入的东西就是new product返回的东西对不对?New product这个事件,它返回的是不是这个参数里面是这样的东西啊,是一个杠product ID这样的东西,所以我们在这里边product点杠product ID把它拿出来啊这里大家可能需要注意一下,我们在这里定义的是一个number对吧?那在这里我们的这个定义是一个U,它们互相之间有可能还会有转化,转就是相互之间类型数据类型转化上的一些问题,那我们为了方便去做这个转化,怎么样去做呢?我们直接把它转成string。这个其实最。
05:01
方便的对吧,他做查询的时候,其实什么样的数据类型string都是可以去查询出来的,好那么我们有一个方法叫做to local string,就是转换成我们当前的这个语言下的。字符串对吧?好,那么这就是我们的查询条件,那查出来的东西,那后边大家应该还记得,我们查出来的东西后面还可以跟那个呃,投影对吧?呃,跟那个就是re projection,然后还可以跟一些对应的一些选项,我们这里就没有那么多复杂条件了,只要满足这个ID查出来就完了,对吧?那这里边查出来就完了,还没完,那怎么去操作呢?我们还有后续的操作对吧?查出来之后还要做判断,那这里可以跟大家想到应该可以跟回调对不对,那这个回调里面。
06:05
也是一个error优先的一个处理方式,那这里边需要做的就是一个DB project这样的一个对应的一个内容,对吧?找到的一个DB project做这样的一个判断,好,那么我们先接下来就会已经查询之后,我们拿到了这个DB project,如果说DB project有的话,那是不是就说明我们这一个数据已经存在了,对吧?这个对应的产产品信息已经在我们的logo里面存储了,所以如果它不等于那的话,我们是不是直接把它return就可以了,对吧?啊,当然我这里面没有写这个error处理啊,大家应该能想到,我们正常来讲还是要先处理error的,对不对,cons.log。
07:05
我们把这个先写出来好,那么写出来之后,接下来我们如果说DB project它已经有的话,那我们直接return,然后。大家会想到啊,接下来就是。我们不用写else,因为前面都已经返回了,对吧?呃,诶这里边。应该没有问题吧?点错吧,有点奇怪啊。呃,DB我看一下这个课件这边应该没有写错吧,最后啊,DB product不等于呢。
08:20
嗯,看起来应该这个这个错误好像不是我们需要考虑的一个错误是吧?好,我们先不管了,呃,然后接下来我们去想,就是如果我们真正这个DB project没有的话,那说明我们就呃真正要把它存到这个mango里面了,对吧?大家会发现DB product返回的这些信息其实还跟我们定义的mango里边的数据还不一样,对吧?所以我们还得把它做一个转换,怎么转换呢?其实很简单,就是在这里我重新定义一个,比方说project一个P,对吧,定义这样的一个对象我们。
09:09
New,一个project model啊,大家知道project model其实就是一个大对象,对吧,所以我们可以在里边去把它对应的内容定义出来,比如说里边啊,大家会想到它的这个block chain ID就应该是。product.product ID对不对?然后他的name就应该是product点内对吧?啊,这个有下划线啊,得注意好,那么呃,同样的大家会想到后边应该还有就是各种各样的东西对吧?Categoryy product.caty啊,这个我就不详细写了,我直接copy过来好了对吧?这个还还挺多的。
10:18
直接copy虑过来啊,呃,这里大家注意一下,我们这里看到前面这个都好说,就是I这里定义了IP FS image harsh和IP FS description harsh,这个我们都是从这个呃,Link里面去取,对吧?然后我们这里的option time optiontime和option and time也是直接拿出来就可以了。Price的话就是我们这里的,这里大家注意。Condition,这里我们直接就给了product condition没有做对应的枚举类型转换,对吧,为什么呢?啊,因为还记得我们在这个store里边,其实本身呃,它。
11:10
就是传出来的时候,这里我们定义的就是一个U,对吧,那我们存到这个product里边来,是不是也对应的就是一个number啊,所以说直接存就好了,对吧?这个只要它是一个数字,这个就都没有什么问题,我们不需要再把它定义成一个枚举类型,这里需要注意的一个是我们还另外加了一个参数,什么参数呢?啊,就是这个product status,因为这也是我们商品不可缺少的一部分信息,对吧?啊,大家会想到,如果之后这个product status去改变的话,其实我们也应该要把这个对应的信息要写进去的,我们可能要根据不同的类型要去做查询的,对吧?好,那么一开始上架产品的时候,那没什么好说的,直接就是零,对吧,这个status就是零,也就是我们对应的那个产品是open的那个状态,好定义了这样一个。
12:10
对象之后,大家就会发现我们是不是就可以直接把它存到对应的这个呃,Mango数据库里面去了,大家会发现我们之前可以直接用它这个抽象的这个类型去点范,对吧,那之后的话应该怎么做呢?之后是不是可以直接用这个P这个数据类型了,因为它是不是本身也是一个具体的product model啊。啊,所以大家看这个存储的这个方式啊,就可以直接p.C大家还记得我们之前是不是讲过,呃,要去插入一个数据的时候,插入一条document的时候,两种方法,要不insert of save对吧,这里可以直接用这个这个方法好,那么这里的话SIM它就是直接。
13:07
一个回调,它返回其实就是对应的一个error对吧,那如果要是我们还是处理一下这个error,如果有的话,呃,我们就送点log把它打印出来。那当然如果要是没有的话,大家就会想到我们可能可以去,呃,就是做一些别的处理对吧?就是比方说我们去打印一些相关的信息啊,或者说去做一些别的输出,比如说在课件这里,大家会看到是调了一个product model.count,就是去做一个计术啊,那这个技术呢,大家会想到它其实就是要去做什么事情呢?就是把我们当前的这个product model里边所有存进去的数据,这是我们一个表,对吧?所以这其实就是要把我们所有的这个数据,这个表里边所有的document的数量要统计一下,好,呃,那这里我就直接copy过来了啊好,这样的话大家就会发现我们就已经做完了,呃,整个的这一个操作,哎,这里是写错了是吧?Else。
14:27
哎,这里还在报错,我们这个直接这么查,应该是看不到有问题对吧?呃,等一下我们跑一下试试吧。这好像是有问题啊,嗯,大家帮我一起检查一下,这个语法很简单,但为什么会这样报错呢?
15:09
自由技能。第第二行哦,这里是吧。好吧,所以大家会发现这个就是这里报错,但其实不是这里出问题啊,对,看的很很很细致非常,呃,这里稍微一疏忽就发现后面会会出这样问题,好,那么我们这里就已经把这一个啊,我们的这个server已经实现了啊,大家可能会发现我们在这里边的这个server里边还定义了一个app.use啊,这个是什么东西呢啊,这个就是。我们之后要去做这个后台服务器的时候,要去响应前台请求的时候用的,对吧,大家看到这个use它定义了什么东西呢?定义了。
16:06
呃,那这个是什么东西,这是不是就是定义了我们所有的请求头里边的一些参数对吧?一些字段,那这里主要定义的是什么呢?Access control law,那所以这里定义的其实就是访问权限跟跨域相关的一些设置,对不对?这里是要开启所有这种跨域请求的,对吧?所以呃,我们可以把这一部分复制过来,呃,这里可以跟大家多说一句,就是大家看到它这里边还写了一个next吗?这个next是什么意思啊?大家会发现它的这个回调定义的时候本身就三个参数,Request,呃,呃,Response,还有next对吧?呃,这里的next是相当于它固有的一个方法,就是在这个express里面的一个固有方法,如果定义了这个next的话,就会继续执行下边的app.use和listen,呃和这个app.get的方法,如果我们这里不定义的话,相当于它到这里就截止了,后面就不执行了啊,所以这个就是,呃,如果我们是只是定义这个请求头的话,那一定是要有这个next啊,这就是一个固定的写法,大家只要知道就可以了。
我来说两句