egg进修笔记-1

入门笔记

请依据官方文档初始化一个simple工程项目,依据以下步骤进修即可,若有不懂的请参考官方文档。

制止csrf考证

依据以下步骤举行掌握的建立,在实行Post操纵的时刻会涌现invalid csrf token毛病。须要制止此特征。

建立路由

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const {
    router,
    controller,
  } = app;
  router.get('/', controller.home.index);
  // 新建资本路由
  router.resources('SystemUser', '/system/user', controller.system.user);
};

掌握器controller.system.user,对应的是controller目次下的system目次内里的user.js文件

建立对应的掌握器

const Controller = require('egg').Controller;

class SystemUserController extends Controller {
  async index() {
    const {
      ctx,
    } = this;
    ctx.body = 'hello ! this is SystemUserController';
  }
}
module.exports = SystemUserController;  

接见地点:localhost:7001/system/user

建立能够提交数据的掌握器要领

const Controller = require('egg').Controller;

class SystemUserController extends Controller {
  async index() {
    const {
      ctx,
    } = this;
    ctx.body = 'hello ! this is SystemUserController';
  }

  async create() {
    const ctx = this.ctx;
    const user = ctx.request.body;
    ctx.body = user;
  }
}

module.exports = SystemUserController;

POST要领接见网址:localhost:7001/system/user 会提醒invalid csrf token毛病。

封闭csrf考证

  // config\config.default.js
  // 封闭csrf考证
  config.security = {
    csrf: {
      enable: false,
    },
  };

开启考证

在上面的例子中,我们经由过程表单提交了任何数据,都邑回显到界面上,假如是数据须要存储或许做其他营业处置惩罚,则须要对用户输入的数据举行考证。
egg供应了egg-validate插件举行表单考证

装置插件

cnpm install egg-validate --save

设置启用插件

/** @type Egg.EggPlugin */
module.exports = {
  // had enabled by egg
  // static: {
  //   enable: true,
  // }
  validate: {
    enable: true,
    package: 'egg-validate',
  },

};

运用考证组件

起首建立一个划定规矩,这里我们定义username是字符串而且是必需的,最大长度为8个字符。
定义password为字符串且必需,最小长度为6个字符。
ctx.validate(createRule, ctx.request.body);
经由过程上述语句举行参数搜检
更多划定规矩请参考:https://github.com/node-modul…

const Controller = require('egg').Controller;

// 定义本接口的要求参数的考证划定规矩
const createRule = {
  username: {
    type: 'string',
    required: true,
    max: 8,
  },
  password: {
    type: 'string',
    required: true,
    min: 6,
  },
};

class SystemUserController extends Controller {
  async index() {
    const {
      ctx,
    } = this;
    ctx.body = 'hello ! this is SystemUserController';
  }

  async create() {
    const ctx = this.ctx;
    // 考证输入参数是不是相符预期花样
    ctx.validate(createRule, ctx.request.body);
    const user = ctx.request.body;
    ctx.body = user;
  }
}

module.exports = SystemUserController;

测试

运用POSTMAN提交恣意字段,则会提醒Validation Failed (code: invalid_param)
怎样检察详细毛病信息呢。下面将定义一致毛病处置惩罚的中间件举行毛病处置惩罚。

一致毛病处置惩罚中间件

在项目的app目次中建立middleware目次,此目次中能够建立中间件。

建立毛病处置惩罚中间件

'use strict';
module.exports = () => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
    } catch (err) {
      // 掌握台输出
      console.error('MiddleWare errorHandler', err);
      // 一切的异常都在 app 上触发一个 error 事宜,框架会纪录一条毛病日记
      ctx.app.emit('error', err, ctx);
      // status 假如没有,则一致为500
      const status = err.status || 500;
      // 假如是500毛病,且是临盆环境,则一致显现“Internal Server Error”
      const error = status === 500 && ctx.app.config.env === 'prod' ? 'Internal Server Error' : err;
      // 转变上下文状况代码
      ctx.status = status;
      // 从 error 对象上读出各个属性,设置到相应中
      ctx.body = {
        error,
      };
    }
  };
};

启用中间件

文件configconfig.default.js中

  // add your middleware config here
  config.middleware = [];

将其修改成包括你建立的中间件

  // add your middleware config here
  // errorHandler 一致毛病处置惩罚
  config.middleware = [ 'errorHandler' ];

  // errorHandler 只在/api上见效
  config.errorHandler = {
    match: '/api',
  };

如上所示,能够设置毛病处置惩罚中间件在什么URL上面起作用。这里我们运用/api

测试路由

先运用本来的路由接见:localhost:7001/system/user
毛病提醒照旧
变动路由:翻开文件:approuter.js

  // router.resources('SystemUser', '/system/user', controller.system.user);
  router.resources('SystemUser', '/api/v1/system/user', controller.system.user);

再次接见:localhost:7001/api/v1/system/user
提醒信息会变成:

{"error":{"message":"Validation Failed","code":"invalid_param","errors":[{"message":"required","field":"username","code":"missing_field"},{"message":"required","field":"password","code":"missing_field"}]}}

花样化接口返回的数据结构

在上面显现毛病信息中,能够看到范例的Json数据,假如开辟接口,我们就须要定义一致的数据结构,以便客户端举行剖析。
在API开辟中,能够定义接口的规范返回花样。经由过程框架扩大体式格局定义返回数据花样是一个异常轻易的要领。
在app目次中建立extend目次,对egg的内置对象Helper举行扩大即可。

建立Helper扩大

文件:app/extend/helper.js

'use strict';

module.exports = {
  /**
   * 挪用一般状况的返回数据封装
   * @param {Object} ctx - context
   * @param {*} msg  - message
   * @param {*} data - 数据
   */
  success(ctx, msg, data) {
    ctx.body = {
      code: 0,
      msg,
      data,
    };
    ctx.status = 200;
  },

  /**
   * 处置惩罚失利,处置惩罚传入的失利缘由
   * @param {*} ctx - context
   * @param {Object} res - 返回的状况数据
   */

  fail(ctx, res) {
    ctx.body = {
      code: res.code,
      msg: res.msg,
      data: res.data,
    };
    ctx.status = 200;
  },
};

革新一致毛病处置惩罚

// 从 error 对象上读出各个属性,设置到相应中
// ctx.body = {
//   error,
// };
// 花样化返回毛病信息
ctx.helper.fail(ctx, {
  code: status,
  msg: error.message,
  data: error.errors,
});

测试

再次接见:localhost:7001/api/v1/system/user
提醒信息会变成:

{
    "code": 422,
    "msg": "Validation Failed",
    "data": [
        {
            "message": "required",
            "field": "username",
            "code": "missing_field"
        },
        {
            "message": "required",
            "field": "password",
            "code": "missing_field"
        }
    ]
}

将掌握器user中的返回改成规范花样

async create() {
  const ctx = this.ctx;
  // 考证输入参数是不是相符预期花样
  ctx.validate(createRule, ctx.request.body);
  const user = ctx.request.body;
  // ctx.body = user;
  this.ctx.helper.success(this.ctx, 'ok', user);
}

提交满足要求的数据,测试准确的返回数据
username testuser
password 1234567890
提交后将返回规范的数据花样

{
    "code": 0,
    "msg": "ok",
    "data": {
        "username": "testuser",
        "password": "1234567890"
    }
}
    原文作者:Tianby
    原文地址: https://segmentfault.com/a/1190000018310886
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞