编写插件

ZanProxy插件是是一个npm包,这个npm包需要导出一个类,这个类要实现两个方法:proxymanage除此之外没有任何特殊要求proxy方法用于请求的处理,manage方法用于插件的配置。

可以参考的例子:点击这里

注意

写好ZanProxy插件包后需要发包,可以发布到私有仓库,添加时可以指定私有仓库的地址。

proxy方法

proxy方法需要返回一个ZanProxy中间件,该中间件会被加载到代理服务器中。

中间件

ZanProxy中间件是一个处理请求的函数,形如async (ctx, next) => {…}。其中ctx是请求的上下文,默认有两个属性reqres

req是一个http.IncomingMessage实例,代表着请求。如果req.body被赋值,则请求体的body会被替代。目前req.body只支持字符串类型。

res是一个http.ServerResponse实例,代表着响应。如果res.body被赋值,则响应体的body会被替代,且请求不会被转发res.body

添加Access-Control-Allow-Origin响应头的中间件的例子

  1. async (ctx, next) => {
  2. ctx.res.setHeader('Access-Control-Allow-Origin', '*');
  3. await next()
  4. }

manage方法

manage方法需要返回一个Koa的App,该app会被挂载到ZanProxy管理服务器的/plugins/{插件名}路径,用于插件的可视化数据管理。该app可以有自己的http接口和静态资源。

管理Access-Control-Allow-Origin响应头数据的manage例子

  1. manage() {
  2. const router = new Router();
  3. const root = path.join(__dirname, '../ui/site/') // 静态页面的路径
  4. router.post('/save', async ctx => {
  5. const cors = ctx.request.body.cors;
  6. this.cors = cors;
  7. ctx.body = {
  8. status: 200,
  9. msg: 'OK'
  10. }
  11. })
  12. router.get('/cors', async ctx => {
  13. ctx.body = {
  14. status: 200,
  15. msg: 'OK',
  16. data: {
  17. cors: this.cors
  18. }
  19. }
  20. })
  21. const app = new Koa()
  22. app
  23. .use(bodyparser())
  24. .use(router.routes())
  25. .use(router.allowedMethods())
  26. .use(KoaStatic(root))
  27. return app;
  28. }

完整的添加Access-Control-Allow-Origin响应头的插件的例子

  1. const Router = require('koa-router');
  2. const KoaStatic = require('koa-static');
  3. const path = require('path');
  4. const bodyparser = require('koa-bodyparser');
  5. const Koa = require('koa');
  6. module.exports = class CorsPlugin {
  7. constructor() {
  8. this.cors = '*'
  9. }
  10. manage() {
  11. const router = new Router();
  12. const root = path.join(__dirname, '../ui/site/') // 静态页面的路径
  13. router.post('/save', async ctx => {
  14. const cors = ctx.request.body.cors;
  15. this.cors = cors;
  16. ctx.body = {
  17. status: 200,
  18. msg: 'OK'
  19. }
  20. })
  21. router.get('/cors', async ctx => {
  22. ctx.body = {
  23. status: 200,
  24. msg: 'OK',
  25. data: {
  26. cors: this.cors
  27. }
  28. }
  29. })
  30. const app = new Koa()
  31. app
  32. .use(bodyparser())
  33. .use(router.routes())
  34. .use(router.allowedMethods())
  35. .use(KoaStatic(root))
  36. return app;
  37. }
  38. proxy() {
  39. return async (ctx, next) => {
  40. ctx.res.setHeader('Access-Control-Allow-Origin', this.cors || '*');
  41. await next()
  42. }
  43. }
  44. }

 编写插件  - 图1

原文: https://youzan.github.io/zan-proxy/book/plugin/code.html