「fastify项目实战」投票Web应用之五
「fastify项目实战」投票Web应用之四
「fastify项目实战」投票Web应用之三
「fastify项目实战」投票Web应用之二
「fastify项目实战」投票Web应用之一
我们完成了用户模型和用户路由的插件化工作之后,接下来是对投票功能的插件化。每一个插件的创建、注册和使用步骤都是相同的,本文中我们将不再详细介绍投票模型插件化的详细操作步骤,只描述其中完成插件化后的功能,之后我们再增强了投票应用的功能,使其能够依据投票信息获取对应的用户信息,也可以使用用户信息获取对应的投票信息,即在投票条目和用户之间建立多对多的关系。
投票模型
投票模型插件位于models目录下,名称为votes.mjs,通过装饰方法decorate向fastify实例中注册了一个对象,名称为voteModel,这样就可以在其它的插件中使用此投票模型了,voteModel模型提供的全部方法如下表所示。
在投票路由代码中,将所有与投票模型相关的代码都可以去掉了,直接交给投票模型来处理就可以了,下面提供了获取一个投票条目的投票路由实现代码,如图1所示
图1中第58行代码使用了投票模型插件中注册的voteModel对象,使用这个对象的findOne方法查找当前投票模型中是否含有一个Id与voteId相同的投票条目,如果不存在这样的数据,则服务器抛出一个异常,反之,则将对应的投票条目返回给用户。
投票用户模型
在投票模型中,我们定义的投票条目如下图2所示,图中第5行使用了一个名称为count的属性,它表示当前这个投票条目所获得的票数是多少。现在客户需要更多的投票信息,思考下面的两个问题:
- 如何知道都是哪些用户对特定条目进行了投票?
- 如何知道一个用户都对哪些条目进行了投票?
以上的两个问题既不是单独的投票条目问题,也不是单独的用户信息问题,而是投票条目与用户之间的关系问题。如果需要解决上述提出的两个问题,图2中的投票数目count属性就无法满足客户的需求了,现在,我们需要提供一种用户和投票条目联系的数据模型,我们称之为投票用户模型,这个模型中记录了用户投票时的用户Id和对应的投票条目Id。
构建投票用户模型插件
在models目录下创建一个新的文件,名称为vote-users.mjs,在这个文件中定义一个voteUserModel对象,这个对象中含有一个data属性,它是一个数组类型的属性,存储着所有的投票用户模型数据。
图3中第5行代码定义为投票条目的Id值,第6行代码定义为用户的Id值。这两个Id构成了投票用户模型,data属性就表示投票用户模型数组。
支持的操作
元素是否存在
它表示提供一个含有投票Id和用户Id的对象,在成员data数组中查找是否含有与这个对象中信息一致的元素。如下图4所示,其方法名称为has,只使用了一个参数vu。第40-42行代码使用了数组find方法,查找voteId和userId都相同的元素。
添加数据
成员属性data为一个数组类型,在向其进行添加元素时,首先需要检查这个元素是否已经存在于data数组中,可以调用上述的has方法,如果has方法的返回值为真值,那么表明同样的元素已经存在,无需执行添加操作;反之,则这样的元素不存在于data数组中,通过第37行代码将它添加到数组中,如下图5所示。
删除数据
删除数据时首先是检查这个元素是否存在于数组中,如下图6中,第45-47行代码所示,如果这个元素不存在,即findIndex方法的返回值为-1,那么,就无需执行任何操作;反之,则需要调用data数组的splice方法,使用查询到的索引值index作为参数,删除这一个元素。
使用投票条目Id获取所有用户Id
图3中数组data所存储的每一个元素都含有投票条目Id和用户Id值,通过查询数据中的每一个元素的投票Id值,如果元素的voteId值与参数voteId值相同,那么此元素中的用户Id值就是我们所想要的结果,如图7所示,通过第55行代码过滤出元素的voteId与参数voteId相同的元素,之后再执行第56行的map操作,将这个元素转换为一个用户Id。
使用用户Id获取对应的投票条目id
与上一节通过投票Id获取用户Id相类似,这个功能是提供一个用户的Id值,通过查询成员data数组中的用户Id值,得到所有满足条件的投票条目Id值。图8中第60行代码使用userId参数进行过滤data数组中的元素,第61行代码使用map方法将元素转换为投票条目Id。
插件化
完成上述的投票用户模型后,创建一个标准的fastify插件,按照fastify插件的定义标准,创建如下图9所示的代码。
图9中第66行代码使用了装饰方法decorate将voteUserModel对象注入到当前fastify实例中,之后在需要使用这个模型的时候就可以通过注册此插件的方式来访问投票用户模型对象了。
投票路由插件
投票用户模型插件完成之后,我们就可以调整投票路由插件的功能了,首先需要将这个插件引入到当前的路由插件中,使用如下图10的代码。图中第3行代码引入了插件文件vote-users.mjs,之后在第7行代码进行了注册,我们同样使用了fastify-plugin方法,使voteUserModel在整个实例中可用。
获取投票结果
因为投票条目对象的属性count值不能准确地表示投票条目和用户的关系,我们现在通过计算voteUserModel中的数据计算出投票总数。采用如下的计算方法:通过投票条目的Id值调用voteUserModel的方法getUsers获取到所有投票的用户Id数组,之后,再获取到这个数组中元素的个数。
图11中第34行代码获取到所有的投票条目信息,但是,这些投票条目信息中的count属性已经不是真实的投票数目,而是通过第36行代码调用voteUserModel对象中的getUsers方法得到相关的用户Id数组,之后访问这个数组的length属性,这个属性值就是当前投票条目对应的投票数目,我们将投票条目的count属性设置为length。
获取投票条目的用户信息
将获取投票条目的用户信息的路由定义在投票路由文件vote.mjs中,新增一个路由“/votes/:voteId/users”表示获取投票条目的用户信息,它表示获取所有对Id值为voteId的投票条目执行过投票的用户信息。如图12所示。
图12中第41行代码定义了这个功能的路由,使用的方法为GET。第42行代码从路由中获取投票条目的voteId值,之后调用voteUserModel的getUsers方法获取到所有对应的用户Id值,执行到这一步,我们所获取到的信息仅仅是用户的Id值,在这里我们还需要另外一个用户模型,通过用户模型的findWithIds方法得到完整的用户信息,如图12中第44行代码所示。
获取用户的投票条目信息
将用户的投票条目信息的路由放置在用户路由user.mjs文件中,同样新增一个路由“/users/:userId/votes”表示获取用户的投票条目信息。它表示Id为userId的用户都对哪些投票条目进行了投票,如下图13所示。
图13中第20行代码定义了这个对应的路径,同样采用的是GET方法,第21行代码在request对象params属性中获取userId的值,第22行代码使用userId值作为投票用户模型方法getVotes的参数,调用完成之后便获取到所有的投票条目Id值,如果想要获取所有的投票信息,那么同样需要再调用投票模型中的findWithIds方法将Id值转换为对应的投票条目对象。
至此,我们的投票应用功能上基本已经完成了,我们使用了2个路由插件、3个数据模型插件。对于fastify插件的介绍我们就暂时告一段落,接下来的文章将继续介绍fastify的另一个特性-钩子机制。谢谢阅读,我们下一篇文章见。
「fastify项目实战」投票Web应用之五
「fastify项目实战」投票Web应用之四
「fastify项目实战」投票Web应用之三
「fastify项目实战」投票Web应用之二
「fastify项目实战」投票Web应用之一
............试读结束............
查阅全文加微信:3231169 如来写作网:gw.rulaixiezuo.com(可搜索其他更多资料) 本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 3231169@qq.com 举报,一经查实,本站将立刻删除。如若转载,请注明出处:https://www.rulaiwenku.com/165968.html