本项目涉及的内容过多,将分为三篇文章进行展示,第一篇文章整体介绍这个项目的情况,包括项目事项的功能和相关技术,还提供了项目中使用到的数据类型和路由信息等;第二篇文章重点介绍学生路由信息的相关内容;第三篇则重点介绍成绩路由相关内容。
获取所有学生信息列表功能(/students)
获取所有学生信息是指将当前服务器端数据库(内存)中所有的学生信息返回给客户端,在定义这个路由逻辑时,代码如图4所示:
图4中第91行代码中路由器使用了方法get,此方法对应于HTTP协议的GET动词,表示一个GET请求,请求的路径是什么呢?在此例中就是它的第一个参数”/”,前文中我们介绍过,整个studentsRouter是挂载于/students路径下的,因此,整个应用中请求的路径就变为了/students/。get方法的第二个参数为服务器处理这个GET方法时的业务处理器,代码中第92行表示从store中获取students数据,这个操作也很简单,它不对store.students数据执行业务转换,直接输出对应的数值即可。如下图5代码所示。
获取所有学生信息的响应为一个JSON格式的数据,通过使用Response对象res的json方法输出这种格式的数据,消息响应中payload属性为一个或多个学生信息构成的数组值。
获取一个学生的信息数据(/students/:studentsId)
获取一个学生的信息数据与获取所有学生信息数据操作有一点不同,他需要额外的一个参数studentId,用以指定待获取的学生编号,这个参数正是通过路径的最后一个数值:studentId来表示,含有冒号(:)和变量名称的写法为路径参数。假如用户输入的请求地址为/students/100,那么,studentId变量值在通过Express.js的中间件处理后就会被赋值为100,我们在请求处理器中通过使用req.params.studentId来获取这个数值。
图6第55行代码,在get方法的第一个参数中,指定参数为/:studentId的格式用以表示路径中需要一个studentId参数,这个参数可以在get方法处理器函数的第一个参数中获取,第56行代码通过req.params.studentId这样的访问方式将获取到用户指定的studentId值,之后使用这个studentId值作为第57行代码调用函数的参数,通过getStudent函数获取指定的学生信息,对于一个学生的信息查询,返回值的payload信息就是一个student对象。
获取特定学生的信息通过使用数组的filter方法实现,这个filter方法返回值为另一个数组,因此,通过判断返回值数组的长度是否大于0来表示这个学生Id对应的信息是否存在,如果存在这条数据,那么,返回值结果为这个学生信息值;否则,返回值为undefined值。代码如图7所示。
删除一个学生信息数据(/:studentId)
删除一个学生信息的路由与获取一个学生信息的路由相比,它们的路径是相同的,但是,二者所使用的方法是不同的,获取学生信息使用的是路由器的get方法,而删除学生信息采用的方法则是delete方法,这样我们在执行对应的操作时就不会导致服务器迷惑。同样,删除一个学生信息时也需要指定待删除学生的编号Id值,其值与上文中获取一个学生信息所使用的Id值相同,采用的方法都是使用路径参数/:studentId的方式,代码如图8所示。
第80行代码调用了路由器的delete方法,第一个参数为删除学生信息的路径参数,名称为:studentId,之后设置对应的删除方法处理器,第81行代码通过req.params.studentId获取用户传递的学生编号值,之后调用两个方法deleteStudent和deleteScore两个方法。这里为什么需要调用两个方法,而不是只有一个deleteStudent方法呢?因为在这个应用中我们设定学生为“主信息”,成绩信息为“从信息”。如果一个学生信息不存在了,那么,其对应的成绩值必然也是没有任何意义的,因此,每当删除一个学生信息时,我们同样也会删除其对应的成绩信息。完成这些操作之后,我们将删除学生信息的个数作为相应的payload值返回给客户端。
下面图9和图10分别为删除学生信息和删除成绩信息对应的代码,二者执行的逻辑基本一致,只是所操作的对象不同,删除学生信息时,操作对象为store.students;而删除成绩信息时,则为store.scores对象。
创建学生信息的操作(/students)
创建学生信息操作使用的路径与获取学生列表所采用的路径相同,二者所不同的也是路由器所调用的方法名称。创建学生信息时,使用的是post方法,对应于HTTP协议中的POST动词,这个方法会将学生的信息通过JSON格式消息体的方式传递给服务器, express.js通过消息体解析器可以获取到对应的学生信息对象, 如图11所示,第100行代码通过req.body获取客户端发送过来的学生信息,之后生成一个新的学生编号,并存入到数据库(内存)中,如图12所示:
图11第108-111行代码展示了服务器端生成的消息响应时的代码,创建消息的响应体中payload为新建的学生信息,它是一个含有id值的学生信息。
图12中生成学生Id的逻辑为:取得最后一个学生的id值,并对其进行加1操作,即为这个新创建的学生编号值。
更新学生信息的操作
到目前为止,还剩下最后一项对于学生信息的操作:更新学生信息请求。更新学生信息为这些操作中最为复杂的一个,它首先需要明确待更新的学生编号Id是什么,还需要知道更新后的学生信息又是什么。依据上文中学习的知识,我们可以判断出学生信息的Id值是可以通过路径参数进行传递,更新后的学生信息如何传递呢?我们可以像创建学生信息那样,将学生信息存放在消息体中,代码可以写成下图13所示的那样
图13中第65行代码,我们使用了一个新的路由器方法put,它对应于HTTP协议中的PUT动词,表示我们要对HTTP资源进行更新操作,更新的目标可以通过put方法的第一个参数/:studentId指定,方法同上文,在第66行代码中,使用req.params.studentId获取到对应的studentId值,通过req.body获取用户传递对应的学生信息值,使用此两项参数数据,通过调用updateStudent函数完成内存数据的更新操作,请求所对应的响应数据payload为更新后的学生信息内容。
如何更新内存中的学生信息呢?见下图14,通过在store.students中查找学生编号Id为studentId的学生对象,如果找到对应的学生信息对象值,那么,对这个对象中的每一个属性使用新的student相应的数值进行更新。
至此为止,我们已经完成了学生信息相关的5类操作,服务器实现这些操作之后便可以对客户端发出的学生信息请求进行对应的业务处理,用户拿到这些学生信息之后,之后便可以处理每一个学生学科成绩相关的业务逻辑,下一篇文章中我们开始介绍对于学生成绩的处理方式。
本文为Web API服务端开发第二篇文章,此项目一共分为三篇进行介绍,第三篇重点介绍学生成绩路由处理逻辑。
如若转载,请注明出处:https://www.daxuejiayuan.com/24252.html