soonfy / issue-blog

blog using issue
0 stars 0 forks source link

egg #40

Open soonfy opened 6 years ago

soonfy commented 6 years ago

初始化项目 egg-init

npm i egg-init -g
egg-init -h
egg-init --type simple <file path>

soonfy

soonfy commented 6 years ago

路由 router

  1. app/controller 中新建一个文件 user.js 并且定义 controller 类

    'use strict';
    const Controller = require('egg').Controller;
    class UserController extends Controller {
    async info() {
    this.ctx.body = 'user router';
    }
    }
    module.exports = UserController;
  2. app/router.js 定义路由规则

    router.get('/user/', controller.user.info);

soonfy

soonfy commented 6 years ago

插件 plugin

以egg-mongoose 为例

search plugin

  1. 安装 package

    npm i -D egg-mongoose
  2. 配置 config/plugin.js

    exports.mongoose = {
    enable: true,
    package: 'egg-mongoose',
    };
  3. 配置 config/config.default.js

    config.mongoose = {
    client: {
    url: 'mongodb://localhost/social_development',
    options: {
      // mongos: true,
      server: {
        socketOptions: { keepAlive: 1, autoReconnect: true },
        reconnectTries: 600,
        reconnectInterval: 1000,
      },
    },
    },
    };
  4. 定义 schema,model

    module.exports = app => {
    const mongoose = app.mongoose;
    const Schema = mongoose.Schema;
    const UserSchema = new Schema({
    name: String,
    });
    return mongoose.model('User', UserSchema, 'users');
    };
  5. 在 controller或者service使用

    let data = await this.ctx.model.User.find({ name });

soonfy

soonfy commented 6 years ago

service

  1. app/service 新建 user.js 定义 service

    const Service = require('egg').Service;
    class UserService extends Service {
    async find(name) {
    const users = await this.ctx.model.User.find({ name });
    return users;
    }
    async remove(name) {
    const res = await this.ctx.model.User.remove({ name });
    return res;
    }
    }
    module.exports = UserService;
  2. 在 controller 使用 service

    async info() {
    const name = await this.ctx.service.user.find('name');
    this.ctx.body = name;
    }

soonfy

soonfy commented 6 years ago

定时任务 schedule

定义定时任务,在 app/schedule 新建 update.js

const Subscription = require('egg').Subscription;
class Update extends Subscription {
  // 通过 schedule 属性来设置定时任务的执行间隔等配置
  static get schedule() {
    return {
      // interval: '1m', // 1 分钟间隔
      cron: '0 0 */3 * * *',
      type: 'all', // 指定所有的 worker 都需要执行
    };
  }
  // subscribe 是真正定时任务执行时被运行的函数
  async subscribe() {
    const res = await this.ctx.curl('http://www.api.com/cache', {
      dataType: 'json',
    });
    this.ctx.app.cache = res.data;
  }
}
module.exports = Update;

soonfy

soonfy commented 6 years ago

扩展 extend

  1. app/extend 新建 js 文件 application, context, request, response

  2. 扩展方法,属性 application

    const NAME = Symbol('Application#name');
    module.exports = {
    // 扩展方法
    log(params) {
    console.log(params);
    },
    // 扩展获取属性
    get name() {
    if (!this[NAME]) {
      this[NAME] = this.config.name;
    }
    return this[NAME];
    },
    };

context

const NAME = Symbol('Application#name');
module.exports = {
  // 扩展方法
  log(params) {
    console.log(params);
  },
  // 扩展获取属性
  get name() {
    if (!this[NAME]) {
      this[NAME] = this.get('ua');
    }
    return this[NAME];
  },
};

soonfy

soonfy commented 6 years ago

egg 中 csrf 防范

Error: nodejs.ForbiddenError: invalid csrf token 解决:在 config 文件添加配置

config.security = {
csrf: {
enable: false,
},
};

soonfy

soonfy commented 6 years ago

egg 在应用层面上使用 koa 中间件

以 koa-jwt 为例

  1. app/middleware 新建 jwt.js 文件

    'use strict';
    module.exports = require('koa-jwt');
  2. config/config.default.js 中配置 jwt 插件

    config.middleware = [ 'jwt' ];
    config.jwt = {
    secret: 'secret', // 插件参数
    // passthrough: true,
    enable: true, // 控制中间件是否开启
    match: [], // 设置只有符合某些规则的请求才会经过这个中间件
    ignore: [ '/wxapi/' ], // 设置符合某些规则的请求不经过这个中间件
    };

soonfy

soonfy commented 6 years ago

egg 在 controller 层面上使用 koa 插件

以 jsonwebtoken 为例

  1. app/middleware 新建 jsonwebtoken.js 文件

    'use strict';
    module.exports = require('jsonwebtoken');
  2. 在相应的 controller 上使用 jsonwebtoken

    resp.token = this.app.middleware.jsonwebtoken.sign({
    userId: resp.userInfo._id,
    exp: Math.floor(Date.now() / 1000) + 60 * 60,
    }, this.config.jwt.secret);

soonfy

soonfy commented 6 years ago

egg-mongoose bug

find() 方法的第二个参数 projection 只有在对应的 controller 才有用。 service/user 定义的 projection 只有在 controller/user 中使用才有效果。

soonfy

soonfy commented 6 years ago

egg config cover

> 对象属性覆盖,必须重写属性,不能空
// config.default.js
config.jwt = {
  enable: true,
  passthrough: true
}

// config.prod.js
// cover, no passthrough error
config.jwt = {
  enable: true,
  passthrough: false
}

soonfy