Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

【扩展】扩展内容自动与原生的合并

  • 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 => {
    
    }