接着上文,再来学习一下 Egg.js 中对 Context(上下文)的扩展。
重新编写一个方法
为了学习更简单明了,在/app/controller/mybj.js
文件里重新编写一个方法newContext()
。先用最简单的方式,在页面显示一个方法名称newContext
就可以了。
async newContext(){ const {ctx} = this ; ctx.body = 'newContext'; }
写完方法,到/app/router.js
里,配置路由。
router.get('/newContext',controller.mybj.newContext);
路由配置完成后,可以在终端中用npm run dev
打开测试服务,然后在浏览器里输入http://127.0.0.1:7001/newContext
如果能正常在页面中显示出newContext
就说明正常了,可以继续下面的操作。
编写 Contenxt 扩展
上面的一些准备方法和路由都写好后,就可以开始本节的正式内容了“扩展 Context 方法”。以前通过上下文来获取传递参数时,get
方法请求和post
方法请求的获取方式是不同的,我们编写的方法就是让这两个请求获取参数的方法统一化,都用params()
方法。
在/app/extend
文件夹下,新建一个文件context.js
(此文件名称是 Egg.js 要求的固定写法,不能改变)。然后编写下面的代码。
module.exports = { params(key){ const method = this.request.method if(method ==='GET'){ return key ? this.query[key] : this.query; }else{ return key? this.request.body[key] : this.request.body; } } };
写完之后,打开/app/controller/mybj.js
文件,使用刚编写的params
获取参数,然后打印在服务端控制台。
async newContext(){ const {ctx} = this ; const params = ctx.params(); console.log(params); ctx.body = 'newContext'; }
这样写完,理论上就可以接收post
和get
请求的参数都可以了。
测试请求参数获得情况
get 请求参数获取
直接在浏览器里输入:
http://127.0.0.1:7001/newContext?username=mybj
在到 VSCode 的终端中查看结果,是可以接收到{ username: 'mybj' }
参数的。
post 请求参数获取
get
请求没问题了,先修改router.js
,把请求方式改为post
。
router.post('/newContext',controller.mybj.newContext);
这里继续使用第 06 节
中讲过的REST Client
插件进行 Post 请求测试。在根目录下,打开test.http
文件,然后编写测试代码。
POST http://127.0.0.1:7001/newContext Content-Type: application/json { "name":"小红", "age":18 }
写好后,点击Send Request
按钮测试,可以看到也是可以接收到 POST 传递的参数的。
总结
本文我们讲解了 Egg.js 中对 Context(上下文对象)的方法扩展,我们编写了一个可以同时接受POST
和GET
的请求的参数 Context 扩展方法,并进行了基本的测试。