目标是建立一个 web QQ的项目,使用的技术栈如下:
后端是基于koa2 的 web api 服务层,提供curd操作的http接口,登录验证使用的是 json web token,跨域方案使用的是 cors;
数据库使用的是 mysql;
为了实时通信,使用的是基于websocket协议的 socket.io 框架;
前端则使用的是 vue + vuex。
本篇则讲叙服务端的搭建,之所以使用 koa,而不使用其他封装过的框架,比如 Egg.js, Thinkjs。因为在我看来,koa2 已经够方便,插件也足够多,完全可以根据自己的需求,像搭积木一样构建出最适合业务需求的框架。这样不但摒弃了很多用不到的插件,使整个框架更加精简,也能对整个框架知根知底,减少了很多不可预知因素的影响。
当然我觉得最主要的是我比较懒😄,不想再去学其他框架特有的api,特有的配置。因为前端有太多框架太多api需要掌握了,对于非互联网公认的技术标准,我觉得学习的优先级还是要靠后一点的。因为这些个框架,三天两头就冒出个热门的,简直多不胜数,学不过来啊,而koa基本都是这些框架的底层,明显靠谱多了。
基本框架搭建
这几个koa插件大部分项目八九不离十要用到:
koa-body 解析http数据
koa-compress gzip压缩
koa-router 路由
koa-static 设置静态目录
koa2-cors 跨域cors
log4js 老牌的日志组件
jsonwebtoken jwt 组件
基本的目录结构
public #公共目录
src #前端目录
server #后端目录
├── common #工具
├── config #配置文件
├── controller #控制器
├── daos #数据库访问层
├── logs #日志目录
├── middleware #中间件目录
├── socket #socketio目录
├── app.js #入口文件
└── router.js #路由
入口文件app.js
主要就是几个中间件配置需要注意一下,这里同时还加载了 socket.io 服务。socket.io 相关的基本知识点可以看我之前写的文章关于socket.io的使用。
//app.js
//...
const path = require("path");
const baseDir = path.normalize(__dirname + "/..");
// gzip
app.use(
compress({
filter: function(content_type) {
return /text|javascript/i.test(con