这章节,主要介绍启动文件app.js和项目引入包package.json的介绍
demo里面的中间件可能不是最新的,但是要注意如果要更新到最新版本后,是否会出现不兼容的情况。
package.json
- koa
koajs框架使用的是2.x版本,所以node版本必须在7.6.0+,支持ES2015和async函数 - koa-router
koa框架的路由层中间件,demo项目是对它进行了封装,通过配置文件的方式,在使用上更加灵活(后续文章会介绍) - koa-bodyparser
解析请求内容,基于co-body,支持json,form,text类型 - koa2-formidable
这个中间件主要是处理koa-bodyparser的问题,针对前端表单的提交(form-data),文件上传控制等 - koa-static
静态资源中间件,如html、js、css、jpg、png等等 - koa-ejs
项目使用的前端模板是ejs模板引擎 - ioredis
redis中间件,demo项目中封装在了RedisService接口服务里面,并且是单例模式
log4js
日志中间件,demo项目中对其再进行了封装,包括输出路径和格式等
promise
promise模块,因为项目有些模块需要用promise包装一下,使其可以使用async/await方式,或者是装配到koa框架内使用(app.use)
superagent
http请求模块,demo项目中已将其封装整合到公共库的HttpHelper,基本能满足日常的get/post方法
superagent-charset
解决superagent页面编码的问题,可以指定请求解析的页面编码方式
koa-orm
orm模块,当前版本是基于sequelize和sk2,demo项目已将其再次封装,并抽离出dao层的base类(BaseModel),而且是单例模式
mysql2
demo项目使用的mysql数据库,所以这里需要引入对应的模块 - koa-session2
session中间件,默认是使用cookie方式,也可以支持redis和mongodb等方式
lodash
一个很强大的工具类模块,里面提供了很多实用的api,而且是使用原生js写的,具体可以查看官网
string
也是一个很强大的字符工具类模块
moment
时间日期处理模块,demo项目中已将其封装整合到公共库的TimeHelper
app.js
- session引入
/*
中间件session
使用cookie方式保存,'key'可以自定义,在前端页面的cookie会看到这个参数
*/
const session = require("koa-session2");
app.use(session({
key: 'koa-all-framework'
}))
key参数值可自定义,相关值可以通过前端页面调试看到对应的数值,默认通过cookie方式保存
- 静态资源引入
/*
静态文件服务器
一般指定到public目录
*/
const serve = require('koa-static');
app.use(serve(__dirname + '/public'));
这里可以自定义静态文件目录位置,注意路径要加上"_dirname",即总是指向被执行 js 文件的绝对路径
- 视图层引入
/*
视图层中间件
使用ejs,并指定页面文件所在的位置和后缀
*/
render(app, {
root: path.join(__dirname, '/public/views'),
layout: false,
viewExt: 'html',
cache: false,
debug: false
});
这里可以自定义视图层文件目录位置、模板后缀等参数,其中"/public/views"为根目录,控制层controller跳转的页面路径以此为起始根位置,然后向下一层层寻找目录路径
- 表单处理中间件
/*
表单中间件
主要解决前端文件提交的问题,并指定上传的临时文件存放的位置
后端controller可通过以下方式获取:
let {body, files} = ctx.request
*/
const formidable = require('koa2-formidable');
const formOpt = {
uploadDir: 'uploads/'
};
app.use(formidable(formOpt));
这里需要注意的一点是引入的顺序,必须要在"koa-bodyparser"之前,因为koa框架是一个洋葱模型,否则表单处理的方法将会被跳过不执行(具体原因可以查看源码并且调试查看两者的区别)
uploadDir参数是上传目录的路径,上传文件时,此目录会先生成一个临时文件,然后再通过重命名的方式修改文件名称
- 请求体解析模块
/*
请求体解析中间件
可解析Json、Raw、文本等格式
这里需要注意中间件的顺序,formidable需放在bodyparser后面(洋葱模型)
*/
const bodyparser = require('koa-bodyparser');
app.use(bodyparser());
这里要注意的就是上面所说的引入顺序问题
- 获取真实ip设置
/*
主要解决获取请求真实IP的问题
*/
app.proxy = true;
koa框架主要通过以下几种方式获取请求的ip:
req.headers[‘x-forwarded-for’] || // 判断是否有反向代理 IP
req.connection.remoteAddress || // 判断 connection 的远程 IP
req.socket.remoteAddress || // 判断后端的 socket 的 IP
req.connection.socket.remoteAddress;
- 路由模块引入
/*
封装后的路由中间件
具体详见该中间件的说明
*/
const routes = require('./app/middleware/routes');
app.use(routes());
一般路由模块放在最后引入,这里使用了demo项目封装好的router中间件