Express : 一个扩展性极强的node框架, 基于ES5,回调异步调用繁琐
koa:Express的下一代基于Node.js的web框架,由express原班人马打造
koa1.0 ES6 使用sgenerator实现异步
var koa = require('koa');
var app = koa();
app.use('/test', function *() {
yield doReadFile1();
var data = yield doReadFile2();
this.body = data;
});
app.listen(3000);
koa2.0 ES7 完全使用Promise和async,await
对比express,koa的主要特点还有:
○ middleware 中间件,使用洋葱圈模型 koa-compress express-compression
○ 增加了一个 Context 的对象,作为这次请求的上下文对象,同时 Context 上也挂载了 Request 和 Response 两个对象 express 只有Request 和 Response 两个对象
○ 异常处理 使用 try catch
async function onerror(ctx, next) {
try {
await next();
} catch (err) {
ctx.app.emit('error', err);
ctx.body = 'server error';
ctx.status = err.status || 500;
}
}
egg:继承与koa ,有洋葱圈模型的中间件,每次我们编写一个中间件,就相当于在洋葱外面包了一层
egg1.x基于koa1.x但增加了async function
egg2.x基于koa2.x,向下兼容,只支持 Node.js 8 及以上的版本
egg.js app目录:一个api的完整过程
-
model/ 定义数据库的表(Schema数据模型),使用不同数据库有不同的定义方法
egg-mongoose -
service/ (可以集合到model里面不单独出来) 使用async function 定义service,调用model的方法进行数据库读写操作 用于编写业务逻辑层
const Service = require('egg').Service;
-
controller/ router里面的api调用对应的controller 方法 用于解析用户的输入,处理后返回相应的结果
-
router/ 暴露到外部的api路由,用于配置 URL 路由规则
-
config/ 放置配置文件,config会自动按环境读取local 和prod ,覆盖default的配置
// plugin.js
jwt: { //处理token验证
enable: true,
package: "egg-jwt"
},
mongoose: { //链接数据库mongoose
enable: true,
package: 'egg-mongoose',
},
cors: { //开启跨域
enable: true,
package: 'egg-cors'
}
//辅助
-
extend/
框架的扩展
-
middleware/
编写中间件,如定义统一错误处理方法,统一登录拦截验证token 中间件调用方法:
方法1. 在router.js中指定具体路由
const { controller, router, middleware } = app;
const auth = middleware.auth()
const permission = middleware.permission()
router.get('/api/user-group/list', auth,permission, controller.userGroup.getUserGroupList);
//(多middleware的使用)
方法2.在config.js 里配置 ,如一个统一错误信息的显示(middleware会自动从middleware/文件夹读取)
config.middleware = [ 'errorHandler'];
config.errorHandler = {
enable: true, // 启用
match: '', // 匹配中间件的请求路由
ignore: '', // 设置忽略过这个中间件的请求路由
//match和ignore不能同时使用,配置方法一样,作用相反,接受字符串或function
match(ctx) {
// 只有 ios 设备才开启
const reg = /iphone|ipad|ipod/i;
return reg.test(ctx.get('user-agent'));
}
// 或:
match: '/static'
};
8.public 放置静态文件 上传文件一般放在./resource/[文件分类]/[日期]/…