eggjs扩展内置对象
Application
-
是一个全局应用对象,一个应用只会实例化一个出来,挂载了一些全局方法。
-
几乎所有被 Loader 加载的js文件,都可以 export 一个函数,此函数使用实例化的 app 作为参数,写法如下:
module.exports = app => { }
Context
- 是一个请求级别对象,每一次收到用户请求都会实例化一个出来,封装了此次请求的信息,挂载了service,model等。
- 在非用户场景也想访问的话,可以手动创建一个匿名实例:
app.createAnonymousContext() - 在定时任务中,每一个task都要接受一个Context对象:
exports.task = async ctx => { await ctx.service.posts.refresh(); };
Request & Response
-
是一个请求级别对象,封装了 Node.js 原生的 HTTP Request和Response 对象
-
需要注意的是
- 获取 POST 的 body
- 应该使用 ctx.request.body
- 而不是 ctx.body
- 获取 POST 的 body
【扩展】扩展内容自动与原生的合并
-
app目录内
- 新建
extend扩展文件夹打开,在里面
- 新建
-
新建
application.js- 作用: 扩展this.app获取的全局Application对象
- 添加内容为:
module.exports = { foo(param){ } }- 可扩展出foo方法,调用方式为this.app.foo()
-
新建
context.js- 作用: 扩展this.ctx获取的全局Context对象
- 添加内容同上
-
新建
request.js- 作用: 扩展this.request获取的全局Request对象
- 添加内容同上
- 也可以在ctx里面直接访问
ctx.request.url 等价于 ctx.url
-
新建response.js
- 作用: 扩展this.response获取的全局Response对象
- 添加内容同上
- 也可以在ctx里面直接访问
ctx.status = 404 等价于 ctx.response.status = 404
-
新建
helper.js- 作用:扩展this.ctx.helper获取的全局Helper对象
- 添加内容同上
- 可提供一些实用的 utility 函数
-
新建
application.unittest.js- 按照测试环境进行选择性扩展全局Application对象
- 也以选择性扩展五个对象中的其他任意一个
-
扩展内部的 方法foo 调用自己的 方法bar
foo(){ this.bar(); } bar(){ } -
几乎所有被Loader加载的js文件,都可以export一个函数,此函数使用app作为参数,比如自定义脚本app.js文件写法如下:
module.exports = app => { }