【多图】记录下使用 koa2 搭建微信中控服务器

2,793 阅读4分钟

这篇文章是接上一篇文章模仿 egg.js 使用 koa2 搭建项目,代码已上传至 github

前言

微信公众号开发的时候,需要先获取 access token,可以这个 token 是有次数限制的,同时这个 token 一次只会有一个有效,也就是如果重新请求,那么上一个获取到的 token 就会失效。

常规情况下这个不是问题,可是当有多个独立服务需要用到微信 API ,这个就会是个非常大的问题。

微信给出的建议就是起一个专门用于刷新和管理 token 的一个服务器,这个就是中控服务器,不过这个如果只是用于管理微信的 token 就有点大材小用了,可以考虑将其他第三方的也接入进来,类似一个微服务的存在,这个服务是不区分环境的,测试,开发,生产都可以使用。

思路

管理 token 的一个主要问题就是 token 会存储在那里,失效时间又由谁去管理。

目前我接触到的做法都是将其存储到 redis 中,使用 redis 来管理 token 的存储和有效时间,如果 redis 中无法获取到 token,就去微信那边获取,如果存在直接返回数据。

核心代码

代码本身就一点点,全部加起来不到几百行(不含第三方包),可是为了能稳定允许这点代码,却需要搭建一个比较完整的项目出来,心累的赶脚😔。

项目搭建

小公司的 node 项目本身业务代码(不含第三方)并不大,并不像浏览器中运行的代码那么庞大,但是搭建项目本身却需要耗费一定时间,除非大牛出手,不然一步一坑是肯定的事情。

不过因为 node.js 本身的环境是可控的,所以我们可以通过使用新的的 api 来解决一部分问题,一般情况下 node 项目的代码并不是很推荐使用构建工具来编译后运行,所以一些特别新的 api 依然不是很推荐在项目中使用。

项目结构是参考 eggjs 的,主要思路在上一篇已经说明,这里主要补充的是远程调式和启动脚本这些的编写。

1. 引入核心插件

  • koa web 框架
  • koa-logger 日志插件,简洁,其实生产想用另一款的
  • koa-router 可选插件,懒人必备
  • axios http 请求插件,支持 node + 浏览器
  • redis 缓存用,其实有点大材小用了
  • nodemon 开发时监听文件变化自动重启应用
  • pm2 生产环境必备的

这里需要注意下,因为中控服务器本身不对外网公开,同时 cookie 仅在浏览器中得到支持,所以 session 插件并不需要引入,模板引擎和静态资源也类似,所以核心就这几个插件就可以了,如果你是大神,估计只要 koa 和 redis 了 😁。

2. 制作启动脚本

我的 npm 脚本,里面主要是定义入口文件,启动时自动安装依赖(只安装生产环境依赖的包),拆分 开发,调试和生产(测试和生产为同一命令)

定义好后的脚本是这样执行的

# 本地开发使用
$ npm run dev

# 启动(本地)调试模式
$ npm run debug

# 启动生产环境
$ npm run start

# 启动测试环境 --env 是 pm2 的功能,具体可看官方文档
$ npm run start -- --env testing

3. 断点调试

远程调试和本地调试在 vscode 中的步骤是一样的,而且大部分远程调试是发生在测试环境(小公司才这样?),所以觉得麻烦的也可以把拍配置写进去。

因为很多人不是很明白 node 这么进行调试,这里介绍下 vscode 的调试步骤。

第一步: 需要在项目中定义一个文件,放在 .vscode/launch.json 文件中,可以定义多个调试配置,如图:

第二部: 在启动命令中添加 --inspect 参数,比如 node 直接启动 node --inspect app.js 或者使用 nodemon 启动 nodemon --inspect ./app.js,如图:

这里注意下 --inspect 参数不能放在最后面,如果你启动不成功,那多半就是你把参数放后面了。

第三部: 选中那个杀虫图标,选中第一步的配置,点击绿色的启动按钮启动,这个时候就可以调试 node 程序了,这里要注意的是打断点只能使用编辑的来做,也就是行号边上,那里需要断点就点那里,在 vscode 中输入 debugger 是无效的,但是也不会报错,默认启动的端口号是 9229,如果改掉,那么第一步那里的配置也需要改掉。

最终效果图

最后

这个项目代码本身并不多,不过为了能让这个项目稳定运行,花了不少的心思,同时因为直接上 koa,所以本身可能也会存在一定的风险。

项目主要作为一个项目的模板使用,eggjs 虽然非常好用,可是还不到时候,小而巧才是目前我们比较需要的。