基于koa2如何只监听一个端口的情况下同时搭建ws和http服务?

660 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

前情提要

  • 本文跳过保姆式教程,只讲重点。其他的要自己去了解哟。
  • 一般情况下,我们去搭建一个管理系统的后端服务时,可能只需要搭建一个http服务就可以了。最多再配置个https服务。但是总有那么些个时候我们需要用上websocket服务,比如聊天室,比如管理系统中的消息模块,比如一些跨域处理,比如模拟消息中间件实现多服务的负载均衡等。那我们该怎么处理呢?我们该怎么让http和ws服务同时共存呢?
  • 准备工作:
    • 首先我们本地需要有node环境。然后全局npm install -g koa-generator
      • koa-generator是koa2提供的一个生成器,可以理解为脚手架。开箱即用。
    • 然后通过koa2 koaproject(koaproject是你想创建的项目名称)

正文

  • 其实当通过脚手架生成一个koa2的项目后,这个http服务就已经搭建完成了。我们只需要通过创建controller模块,管理一下router模块,有需要的话再将model模块搞一下。这样就是一个完整的http服务了。
  • 那么该如何在http的基础上增加ws服务呢?
    • 首先我们这里采用的是node的基础模块:ws模块以及http模块
    • 声明http模块的服务:var server = http.createServer(app.callback());
    • 声明一个ws服务:let ws = new websocket.Server({ server })。这个时候就将http服务和ws服务绑定在一起了。其中websocket指的是导入的node的ws模块。
    • wsss.createWss(ws):其中wss是自己在项目里封装的ws模块。里面主要包含了content,close,message的监听,以及对所有的消息类型进行分类处理的文件。
    • 至此一个http与ws同时存在的服务就搭建好了。他们两个共用一个端口号。
  • 背景:该需求主要是在写一个聊天室的网站时遇到的。当时也是查了好久才找到的。前后端采用的ws均是原生的websocket,未使用第三方插件。
  • 关于ws的思路:
    • 当时写的时候,将所有的客户端的消息的处理都写在了一起,代码比较庞大,而且不利于维护。
    • 改进点:将消息类型进行抽离,处理方法进行抽离。这样就可以实现解耦,在维护上就大有裨益。

代码截图

  • www文件的文件导入 WX20220420-165015.png

WX20220420-165034.png

WX20220420-165054.png

  • 自己封装的wss模块 WX20220420-165158.png