初始化时候,实例代理上下文context实现
实例代理的还有另外比较有代表性的中间件是官方提供 koa-safe-jsonp 中间件,把jsonp的方法挂载在Koa实例app的app.context 属性中。
常见实例代理上下文context实现步骤
Koa实例 let app = new Koa()demo 挂载在 app.context 上,app.context.demoapp.use()中间件直接使用 ctx.demo 方法或属性这里我们实现最简单的模板渲染中间件 jsonp,模仿koa-safe-jsonp的基本能力。
jsonp 的实现步骤
Koa实例 let app = new Koa()jsonp 挂载在 app.context 上,app.context.jsonpapp.use()中间件直接使用 ctx.jsonp 方法或属性渲染模板ctx.body = ctx.jsonp(result)demo源码
https://github.com/chenshenhai/koajs-design-note/tree/master/demo/chapter-05-02
## 安装依赖npm i## 执行 demonpm run start## 最后启动chrome浏览器访问## http://127.0.0.1:3000
function jsonp(app, opts = {}) {let callback = opts.callback || 'callback';app.context.jsonp = function(obj = {}) {let ctx = this;if (Object.prototype.toString.call(obj).toLowerCase() === '[object object]') {let jsonpStr = `;${callback}(${JSON.stringify(obj)})`;// 用text/javascript,让请求支持跨域获取ctx.type = 'text/javascript';// 输出jsonp字符串ctx.body = jsonpStr;} else {ctx.throw(500, 'result most be a json');}};}module.exports = jsonp;
const Koa = require('koa');const jsonp = require('./index');const app = new Koa();jsonp(app, {});app.use(async ctx => {await ctx.jsonp({data: 'this is a demo',success: true});});app.listen(3000, () => {console.log('[demo] jsonp is starting at port 3000');});