利用 chunked 类型响应实现后台请求的监听

栏目: Node.js · 发布时间: 6年前

内容简介:假如我们想监听后台的请求,并将监听到的数据打印到页面。那么复用Koa 在 app 上有提供一个

Koa 中实现 chunked 数据传输 中介绍了如何在 Koa 中实现 Transfer-Encoding:chunked 类型的响应分片传输。这里来看一个应用场景。

假如我们想监听后台的请求,并将监听到的数据打印到页面。那么复用 chunked 类型的响应,我们只需要解决如何在页面 controller 中获取到别的 controller 被执行。

Koa 在 app 上有提供一个 emit 方法派发事件。这样,可以写一个中间件对请求进行拦截,并且派发事件。然后在在监听的地方可通 app.on 来响应事件,假设我们展示监听数据的页面 url 为 /monitor ,在 /monitor 的 controller 中实现 chunked 数据响应,并且监听前面中间件发来的数据,然后不断输出到页面,达到了监听的效果。

实现后代码大概是这样子:

var Koa = require("koa");
var Router = require("@koa/router");

const PORT = 3000;

var app = new Koa();
var router = new Router();

const requestLogger = async (ctx, next) => {
  await next();
  ctx.app.emit(`response`, ctx);
};

app.use(requestLogger);

router.get("/", (ctx, next) => {
  ctx.body = "hello world";
});

router.get("/api", (ctx, next) => {
  ctx.body = {
    status: 0,
    foo: "bar"
  };
});

router.get("/test", (ctx, next) => {
  ctx.body = "hello test";
});

router.get("/monitor", async ctx => {
  const res = ctx.res;
  ctx.status = 200;
  res.setHeader("Content-Type", "text/html");
  res.write(`<h3>net monitor<h3>`);
  return new Promise(() => {
    ctx.app.on("response", data => {
      res.write(`
        <details>
        <summary>
        <a hre="${data.url}">${data.url}</a>
        </summary>
        <pre>${JSON.stringify(data.body, null, 2)}<pre>
        </details>
        `);
    });
  });
});

app.use(router.routes()).use(router.allowedMethods());

app.listen(PORT);
console.info(`server started at http://localhost:${PORT}`);

运行效果:

利用 chunked 类型响应实现后台请求的监听

利用 chunked 类型响应实现后台请求的监听

问题

  • Transfer-Encoding:chunked 依赖于客户端与服务器之间建立的这个连接一直处于未完成的状态,只要服务端不主动 res.end() 掉。但服务器配置 keep alive 的时长设置会影响到该连接,超时后会断开,当然可以将限制调大。
  • 因为在 /monitor 这个页面中,它没有办法知道其他路由的到达与结束,所以这里复用了事件。使得在 /monitor 页面能够监听到其他 controller 的情况。但这种做法会面临内存增长过快的问题,因为连接和事件监听一直保持着。

但如果仅用于调试数据,比如查看页面发生了哪些请求,返回了什么数据,这种一次性暂时的需求,还是没问题的。


以上所述就是小编给大家介绍的《利用 chunked 类型响应实现后台请求的监听》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序设计艺术(第1卷)

计算机程序设计艺术(第1卷)

[美] 唐纳德·E. 克努特 / 苏运霖 / 国防工业出版社 / 2002-9 / 98.00元

7卷本《计算机程序设计艺术》的第1卷以基本的程序设计概念和技术开始,然后专注于信息结构——计算机内部信息的表示、数据元素之间的结构关系以及如何有效地处理它们,给出了对于模拟、数值方法、符号计算、软件和系统设计的初等应用。书中附有大量习题和答案,标明了难易程序及数学概念的使用。 此新版本增加了几十项简单且重要的算法和技术,并对有关数学预备知识作了大量修改以适应现时研究的趋势。一起来看看 《计算机程序设计艺术(第1卷)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具