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(</span>response<span class="pl-pds">, 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(</span>&lt;h3&gt;net monitor&lt;h3&gt;<span class="pl-pds">);

return new Promise(() => {

ctx.app.on("response", data => {

res.write(</span></span> <span class="pl-s"> &lt;details&gt;</span> <span class="pl-s"> &lt;summary&gt;</span> <span class="pl-s"> &lt;a hre="<span class="pl-s1"><span class="pl-pse">${</span><span class="pl-smi">data</span>.<span class="pl-smi">url</span><span class="pl-pse">}</span></span>"&gt;<span class="pl-s1"><span class="pl-pse">${</span><span class="pl-smi">data</span>.<span class="pl-smi">url</span><span class="pl-pse">}</span></span>&lt;/a&gt;</span> <span class="pl-s"> &lt;/summary&gt;</span> <span class="pl-s"> &lt;pre&gt;<span class="pl-s1"><span class="pl-pse">${</span><span class="pl-c1">JSON</span>.<span class="pl-c1">stringify</span>(<span class="pl-smi">data</span>.<span class="pl-c1">body</span>, <span class="pl-c1">null</span>, <span class="pl-c1">2</span>)<span class="pl-pse">}</span></span>&lt;pre&gt;</span> <span class="pl-s"> &lt;/details&gt;</span> <span class="pl-s"> <span class="pl-pds">);

});

});

}); app.use(router.routes()).use(router.allowedMethods()); app.listen(PORT);

console.info(</span>server started at http://localhost:<span class="pl-s1"><span class="pl-pse">${</span><span class="pl-c1">PORT</span><span class="pl-pse">}</span></span><span class="pl-pds">);

运行效果:

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

问题

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

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

相关资源

利用 chunked 类型响应实现后台请求的监听的更多相关文章

  1. Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

    构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...

  2. ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】

    Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成.Server是我们对所有实现了IServer接口的所有类型以及对应对象的统称,如下面 ...

  3. Server是如何完成针对请求的监听、接收与响应1

    Server是如何完成针对请求的监听.接收与响应的[上] Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成.Server是我们对所有实 ...

  4. 不会吧,这也行?iOS后台锁屏监听摇一摇

    目录 背景介绍 探索过程 其他 APP 有没有类似功能 系统提供的摇一摇回调能否满足 其他方法能否实现 利用 CoreMotion 框架,监听加速计原始数据 通过加速计监听摇一摇 控制器相关逻辑和代码 ...

  5. andriod开发,简单的封装网络请求并监听返回.

    一.为什么封装 因为android 4.0 以后的发送网络请求必须要放到异步线程中,而异步线程必须跟handle合作才能更新主线程中的UI,所以建议用一个类继承handler来异步处理网络请求. 二. ...

  6. java事件响应方法汇总(容器类监听、监听器类、AbstractAction、反射)

    Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件)2.实现相关事件监听接口3.注册事件源的动作监听器4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应 ...

  7. 权限管理demo-Http请求前后监听工具

    工具作用: 1. 输出每次请求的参数 2. 接口的请求时间 package com.mmall.common; import com.mmall.util.JsonMapper; import lom ...

  8. 利用MutationObserver对页面元素的改变进行监听

    'use strict'; let MutationObserver = window.MutationObserver || window.WebKitMutationObserver || win ...

  9. 利用Python的pyHook包来进行键盘监听

    最近在实习的时候发现一件很蛋疼的事情,那就是我们组的项目因为有后台进程,所有每次运行完以后后台进程都必须要自己手动关闭,每次编译之前忘记关就会有一大堆编译错误,我就想直接弄个可以快捷键直接关闭算了   ...

随机推荐

  1. Java工作流引擎表单引擎之JS表单字段输入脚本验证

    关键字: 表单设计器, 字段验证. workflow,ccform, ccBPM. 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流bpm工作流系统  java工作流 ...

  2. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  3. Nginx:基本概念

    守住一方平安,尽力而为,问心无愧就好.     Nginx同Apache一样都是一种WEB服务器,Nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3 ...

  4. Kafka实战(七) - 优雅地部署 Kafka 集群

    既然是集群,必然有多个Kafka节点,只有单节点构成的Kafka伪集群只能用于日常测试,不可能满足线上生产需求. 真正的线上环境需要考量各种因素,结合自身的业务需求而制定.看一些考虑因素(以下顺序,可 ...

  5. 【译】如何使用docker-compose安装anchore

    如何使用docker-compose安装anchore,本篇译自Install with Docker Compose. Preface 在本节中,您将学习如何启动和运行独立的Anchore引擎安装, ...

  6. spinand之data buffer

    data buffer简介 spinand一般会有一个内置的data buffer. 以W25N01GV为例,一个page是2048bytes外加64bytes的spare数据,其data buffe ...

  7. 在 .NET Core 3.0 中支持 Newtonsoft.Json 的使用

    .NET Core 3.0 已经使用了一整套内置的 Josn 序列化/反序列化方案,而且看上去效率还不错.但对于某些项目必须使用到 Newtonsoft.Json 的时候,就会抛出如下异常: Syst ...

  8. bayaim——达梦数据库安装DM7-单实例-Centos7.txt

    bay——安装_达梦DM7-单实例-Centos7.txt IP:10.20.100.22 ---------------------------------------------1.下载 注意:要 ...

  9. Python3 中的Number

    Python3 支持 int.float.bool.complex(复数). 在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long. 像大多数语言一样,数 ...

  10. java 报错 System.out.printIn 错误: 找不到符号

    java 运行 System.out.printIn() 报错 ,java System.out.println 这是错误示范 !!! System.out.printIn("仔细看看pri ...