初始化时候,实例代理上下文context实现

前言

实例代理的还有另外比较有代表性的中间件是官方提供 koa-safe-jsonp 中间件,把jsonp的方法挂载在Koa实例appapp.context 属性中。
常见实例代理上下文context实现步骤

  • 初始化一个Koa实例 let app = new Koa()
  • 将需要的属性或者方法 demo 挂载在 app.context 上,app.context.demo
  • app.use()中间件直接使用 ctx.demo 方法或属性

这里我们实现最简单的模板渲染中间件 jsonp,模仿koa-safe-jsonp的基本能力。

实现步骤

jsonp 的实现步骤

  • step 01 初始化一个Koa实例 let app = new Koa()
  • step 02 将需要的属性或者方法 jsonp 挂载在 app.context 上,app.context.jsonp
  • step 03 在app.use()中间件直接使用 ctx.jsonp 方法或属性渲染模板
  • step 04 当前请求响应要返回jsonp数据时候 ctx.body = ctx.jsonp(result)

    实现源码

    demo源码
    https://github.com/chenshenhai/koajs-design-note/tree/master/demo/chapter-05-02

    1. ## 安装依赖
    2. npm i
    3. ## 执行 demo
    4. npm run start
    5. ## 最后启动chrome浏览器访问
    6. ## http://127.0.0.1:3000

    解读

    1. function jsonp(app, opts = {}) {
    2. let callback = opts.callback || 'callback';
    3. app.context.jsonp = function(obj = {}) {
    4. let ctx = this;
    5. if (Object.prototype.toString.call(obj).toLowerCase() === '[object object]') {
    6. let jsonpStr = `;${callback}(${JSON.stringify(obj)})`;
    7. // 用text/javascript,让请求支持跨域获取
    8. ctx.type = 'text/javascript';
    9. // 输出jsonp字符串
    10. ctx.body = jsonpStr;
    11. } else {
    12. ctx.throw(500, 'result most be a json');
    13. }
    14. };
    15. }
    16. module.exports = jsonp;

    使用

    1. const Koa = require('koa');
    2. const jsonp = require('./index');
    3. const app = new Koa();
    4. jsonp(app, {});
    5. app.use(async ctx => {
    6. await ctx.jsonp({
    7. data: 'this is a demo',
    8. success: true
    9. });
    10. });
    11. app.listen(3000, () => {
    12. console.log('[demo] jsonp is starting at port 3000');
    13. });

    附录

    参考

  • https://github.com/koajs/koa-safe-jsonp