https://eggjs.org/zh-cn/basics/extend.html
extend扩展,默认都是导出一个对象,里面写方法
image.png
image.png

命名规范

扩展都是放在 app/extend目录里面的
扩展名都是有规范的

  • application.js
    • this.app 是对 application的扩展
  • context.js
    • this.ctx 是对 context的扩展
  • request.js
  • response.js
  • helper.js

image.png

  1. 'use strict';
  2. const { Controller } = require('egg');
  3. class SkuController extends Controller {
  4. async index() {
  5. const { ctx, app } = this;
  6. // 查询数据库
  7. const option = {
  8. where: { id: 1 },
  9. limit: 1,
  10. offset: 1,
  11. };
  12. const res = await ctx.model.User.findAll(option);
  13. ctx.body = res;
  14. }
  15. }

application 全局应用

/app/extend/application.js

  1. 'use strict';
  2. const path = require('path');
  3. module.exports = {
  4. // 方法扩展
  5. package(key) {
  6. const pkg = getPackage();
  7. return key ? pkg[key] : pkg;
  8. },
  9. // 属性扩展
  10. get packageName() {
  11. const pkg = getPackage();
  12. return pkg.name;
  13. },
  14. // 属性扩展
  15. get allPackage() {
  16. return getPackage();
  17. },
  18. };
  19. function getPackage() {
  20. const filePath = path.join(process.cwd(), 'package.json');
  21. const pkg = require(filePath);
  22. return pkg;
  23. }

Controller中使用

  1. async index() {
  2. const { ctx, app } = this;
  3. console.log('function', app.package('name'));
  4. console.log('attr', app.packageName, app.allPackage);
  5. }

context 上下文

对 response,request的扩展,还是和 context相关的,都是通过 ctx进行调用的

  • ctx.request
  • ctx.response

/app/extend/context.js

  1. 'use strict';
  2. module.exports = {
  3. // 方法扩展,获取get 或 post的参数
  4. params(key) {
  5. const { method, body } = this.request;
  6. // get从 url获取参数
  7. if (method === 'GET') {
  8. return key ? this.query[key] : this.query;
  9. }
  10. return key ? body[key] : body;
  11. },
  12. // 属性扩展
  13. get User() {
  14. return this.ctx.session
  15. }
  16. };

Controller中使用

  1. async index() {
  2. const { ctx, app } = this;
  3. const params = ctx.params() // 获取 get的 query参数
  4. const params = ctx.params('id')
  5. console.log('ctx.params', params)
  6. }

http://www.lulongwen.com/index.html?user=lucy&id=10

request 请求

/app/extend/request.js

  1. 'use strict';
  2. module.exports = {
  3. // ctx.request.token
  4. get token() {
  5. console.log(this.header);
  6. return this.get('token');
  7. },
  8. };

Controller中使用

  1. async setToken() {
  2. const { ctx } = this;
  3. ctx.body = {
  4. status: 200,
  5. token: ctx.request.token,
  6. };
  7. }

response 响应

/app/extend/response.js

  1. 'use strict';
  2. module.exports = {
  3. // ctx.response.token = 'ok'
  4. set token(token) {
  5. console.log(this.header);
  6. return this.set('token', token);
  7. },
  8. };

Controller中使用

  1. async setToken() {
  2. const { ctx } = this;
  3. ctx.response.token = 'ok';
  4. ctx.body = {
  5. status: 200,
  6. token: 'ok',
  7. };
  8. }

image.png

helper 工具库

/app/extend/helper.js

  1. 'use strict';
  2. module.exports = {
  3. // 字符串转 base64
  4. base64Encode(str = '') {
  5. return new Buffer(str).toString('base64');
  6. },
  7. };

Controller中使用

  1. async setToken() {
  2. const { ctx } = this;
  3. const tokenEncode = ctx.helper.base64Encode('ok');
  4. ctx.response.token = tokenEncode;
  5. ctx.body = {
  6. status: 200,
  7. token: tokenEncode,
  8. };
  9. }

image.png

config.unittest.js