扩展方式

image.png

写法

在app目录下新建文件夹 extend,对什么进行扩展就新建什么文件——都是有规范的
image.png

方法扩展

app/extend/application.js
功能:获取 package.json 内容,不传参返回全部,传参返回key 对应的 value

利用 path 获取 package.json 文件路径,再require获取到内容

  1. 'use strict';
  2. const path = require('path');
  3. module.exports = {
  4. // 方法扩展
  5. // 获取 package.json 中的内容
  6. package(key) {
  7. const pack = getPack();
  8. return key ? pack[key] : pack;
  9. },
  10. };
  11. function getPack() {
  12. const filePath = path.join(process.cwd(), 'package.json');
  13. const pack = require(filePath);
  14. return pack;
  15. }

使用方法

  1. async newApplication() {
  2. const { ctx, app } = this;
  3. const packageInfo = app.package();
  4. ctx.body = packageInfo;
  5. }

属性扩展

利用 js 对象中的 get ,使其直接成为实例的属性

  1. // 属性扩展
  2. get allPackage() {
  3. return getPack();
  4. },

使用:

  1. const allPack = app.allPackage

不同的扩展方式也是类似的

对context 扩展:
扩展一个 get、post 通用的 查询参数方法
app/extend/context.js

  1. 'use strict';
  2. module.exports = {
  3. // get、post 通用的 查询参数方法
  4. params(key) {
  5. // 这里面的 this 就是 ctx
  6. const method = this.request.method;
  7. if (method === 'GET') {
  8. return key ? this.query[key] : this.query;
  9. }
  10. return key ? this.request.body[key] : this.request.body;
  11. },
  12. };

使用:

  1. async newContext() {
  2. const { ctx } = this;
  3. const params = ctx.params();
  4. ctx.body = params;
  5. }

效果:
get
image.png
post:
image.png

注意都已经配置好了路由:

  1. router.get('/newApplication', controller.home.newApplication);
  2. router.get('/newContext', controller.home.newContext);
  3. router.post('/newContext', controller.home.newContext);

对 request 进行扩展:
app/extend/request.js
获取get请求中请求头 header 中的 token 属性

  1. 'use strict';
  2. module.exports = {
  3. // 获得get 请求头header中 token 属性
  4. get token() {
  5. // 直接用get方式
  6. return this.get('token');
  7. },
  8. };

对 response 进行扩展:
app/extend/response.js
对 token 进行设置

  1. 'use strict';
  2. module.exports = {
  3. set token(token) {
  4. this.set('token', token);
  5. },
  6. };

使用:

  1. async newResponse() {
  2. const { ctx } = this;
  3. const body = (ctx.response.token = 'zhoooOOO');
  4. ctx.body = body;
  5. }

对 helper 进行扩展:
扩展一个 转换 base64 的帮助函数
app/extend/helper.js

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

使用:

  1. const { ctx } = this;
  2. const body = (ctx.response.token = 'zhoooOOO');
  3. const base64Body = ctx.helper.base64Encode(body);
  4. ctx.body = base64Body;