node.js,express.js,koa.js,egg.js都是些啥?

468 阅读2分钟

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的完整过程

  1. model/ 定义数据库的表(Schema数据模型),使用不同数据库有不同的定义方法 egg-mongoose

  2. service/ (可以集合到model里面不单独出来) 使用async function 定义service,调用model的方法进行数据库读写操作 用于编写业务逻辑层

const Service = require('egg').Service;
  1. controller/ router里面的api调用对应的controller 方法 用于解析用户的输入,处理后返回相应的结果

  2. router/ 暴露到外部的api路由,用于配置 URL 路由规则

  3. 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'
}

//辅助

  1. extend/

    框架的扩展

  2. 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/[文件分类]/[日期]/…