日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Koa 中实现 chunked 数据传输

發(fā)布時(shí)間:2023/11/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Koa 中实现 chunked 数据传输 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有關(guān)于 Transfer-Encoding:chunked 類型的響應(yīng),參見之前的文章HTTP 響應(yīng)的分塊傳輸。這里看 Koa 中如何實(shí)現(xiàn)。

Koa 中請(qǐng)求返回的處理

雖然官方文檔有描述說明不建議直接調(diào)用 response.write:

Bypassing Koa's response handling is not supported. Avoid using the following node properties:

  • res.statusCode
  • res.writeHead()
  • res.write()
  • res.end()

但要實(shí)現(xiàn)分片向客戶端發(fā)送數(shù)據(jù),必然還是得調(diào)用 Node.js Http 模塊的 response.write(chunk[, encoding][, callback]) 方法,而這里的 response 就是 ctx.res 或 ctx.response。

所以為什么 Koa 要說不建議直接調(diào)用上述方法操作請(qǐng)求的返回呢,我們來看看 Koa 內(nèi)部對(duì) response 都會(huì)做些什么默認(rèn)的處理。

application.js

handleRequest(ctx, fnMiddleware) {const res = ctx.res;res.statusCode = 404;const onerror = err => ctx.onerror(err);const handleResponse = () => respond(ctx);onFinished(res, onerror);return fnMiddleware(ctx).then(handleResponse).catch(onerror);}

在應(yīng)用完各種中間件后(fnMiddleware(ctx))通過 handleResponse 對(duì)請(qǐng)求進(jìn)行一些操作,最終是在 respond 函數(shù)里。

respond 方法 function respond(ctx) {// allow bypassing koaif (false === ctx.respond) return;if (!ctx.writable) return;const res = ctx.res;let body = ctx.body;const code = ctx.status;// ignore bodyif (statuses.empty[code]) {// strip headersctx.body = null;return res.end();}if ('HEAD' == ctx.method) {if (!res.headersSent && isJSON(body)) {ctx.length = Buffer.byteLength(JSON.stringify(body));}return res.end();}// status bodyif (null == body) {if (ctx.req.httpVersionMajor >= 2) {body = String(code);} else {body = ctx.message || String(code);}if (!res.headersSent) {ctx.type = 'text';ctx.length = Buffer.byteLength(body);}return res.end(body);}// responsesif (Buffer.isBuffer(body)) return res.end(body);if ('string' == typeof body) return res.end(body);if (body instanceof Stream) return body.pipe(res);// body: jsonbody = JSON.stringify(body);if (!res.headersSent) {ctx.length = Buffer.byteLength(body);}res.end(body); }

respond 方法里會(huì)根據(jù)外部是否有設(shè)置過 ctx.body,以及不同的 header 來設(shè)置 ctx.body,最終會(huì)調(diào)用 response.end 來結(jié)束掉本次請(qǐng)求。

注意到如果設(shè)置了 ctx.respond = false,這個(gè)方法就直接 return 了,這是一種跳過這里處理的方式。但其實(shí)如果我們?cè)谥虚g件中手動(dòng)調(diào)用了 ctx.res.end() 后,相當(dāng)于已經(jīng)提前結(jié)束掉請(qǐng)求了,同樣也不會(huì)走 Koa 這里的處理。

所以直接在中間件中調(diào)用 ctx.res.write() 及 ctx.res.end() 就可以實(shí)現(xiàn) chunked 類型的響應(yīng),倒無須對(duì) Koa 做額外設(shè)置。

Koa 實(shí)現(xiàn) chunked 數(shù)據(jù)傳輸

根據(jù)上面的分析,及之前一篇關(guān)于HTTP 響應(yīng)的分塊傳輸?shù)奈恼?#xff0c;我們得出以下 Koa 中的實(shí)現(xiàn)邏輯:

const Koa = require("koa"); const app = new Koa(); const PORT = 3000; app.use((ctx, _next) => {const res = ctx.res;ctx.status = 200;res.setHeader("Content-Type", "text/html");res.write(`start<br>`);return new Promise(resolve => {let i = 0,total = 5;while (i <= total) {(function(i) {setTimeout(() => {if (i === total) {resolve();res.end();} else {res.write(`${i}<br>`);}}, i * 1000);})(i);i++;}}); });app.listen(PORT); console.info(`server started at http://localhost:${PORT}`);

運(yùn)行效果:

Koa 中實(shí)現(xiàn) chunked 響應(yīng)的運(yùn)行效果

如你所見,Koa 中的這個(gè)實(shí)現(xiàn)會(huì)在調(diào)用 ctx.res.end() 后將本來應(yīng)該在頁面內(nèi)容中處于最頂部的內(nèi)容,移動(dòng)到最底部。不解。

或者通過 curl 在命令行中查看效果:

$ curl -N http://localhost:3000

命令行中接收 chunked 數(shù)據(jù)的效果

示例代碼可在 wayou/koa-chunked-response 找到。

相關(guān)資源

  • wayou/koa-chunked-response
  • Koa documentation
  • Node.js Docs - response.write(chunk[, encoding][, callback])
  • Node.js Docs - response.end([data][, encoding][, callback])

轉(zhuǎn)載于:https://www.cnblogs.com/Wayou/p/koa_transfer_encoding_chunked.html

總結(jié)

以上是生活随笔為你收集整理的Koa 中实现 chunked 数据传输的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕一区二区人妻视频 | 黑人黄色录像 | 99久久久无码国产精品性 | 久操精品视频 | 人妻91麻豆一区二区三区 | 日韩精品亚洲一区 | 中文字幕一区二区三区视频 | 欧美另类z0z变态 | 色视频在线观看免费 | 无码精品人妻一区二区三区湄公河 | 尤物视频一区 | 一级视频在线播放 | 美女在线不卡 | 女人的毛片 | 国产美女被草 | 成人亚洲精品久久久久软件 | 美女少妇毛片 | 四虎午夜影院 | 亚洲天堂精品一区 | 秋霞午夜鲁丝一区二区老狼 | 午夜国产片 | 欧美性猛交一区二区三区精品 | 亚洲天堂高清 | 久久嫩草精品久久久久 | 国产传媒精品 | 日韩欧美无 | 丁香花高清在线 | 黄色视屏软件 | 成人在线免费观看网址 | 中文字幕人妻互换av久久 | 成人夜视频 | 日本理论片午伦夜理片在线观看 | 亚洲天堂黄 | 97干在线 | 九九在线观看免费高清版 | 久久综合导航 | 欧州一区二区三区 | 黄色网址哪里有 | 亚瑟av在线 | 欧美激情二区三区 | 超碰人人国产 | 中日韩精品视频在线观看 | 蜜桃av免费在线观看 | 欧美猛交xxx| 黄色aa网站 | 男女一级黄色 | 国产精品久久久久久久免费 | 丁香花高清视频完整电影 | 亚洲精品九九 | 男女久久久 | 91精品视频国产 | 亚洲第一页在线 | 一区二区三区四区在线免费观看 | 日韩成人短视频 | 成人羞羞国产免费动态 | 欧美激情视频一区二区三区不卡 | 在线观看一级片 | 五月婷婷开心 | 亚洲国产网 | 国产男女无遮挡猛进猛出 | 精品一区二区三区在线免费观看 | 国产精品xx | 欧美大屁股熟妇bbbbbb | 精品久久久视频 | 亚洲精品视频国产 | 国产五区| 日日干视频 | 日韩欧美小视频 | 丁香激情婷婷 | 欧美一级成人 | 成人另类小说 | 男生舔女生的屁股 | 亚洲欧美日韩综合在线 | 海角社区在线视频播放观看 | 色人阁在线视频 | 少妇按摩一区二区三区 | 欧美日韩中文字幕在线播放 | 特级精品毛片免费观看 | 激情六月色 | 日韩影院一区二区 | 久久精品国产久精国产 | 免费看欧美一级特黄a大片 国产免费的av | 久久99国产精品视频 | 夜夜草网 | 爆乳熟妇一区二区三区霸乳 | 成人免费毛片入口 | 在线观看日韩一区 | 成人精品视频 | 亚洲乱码国产乱码精品精98午夜 | 天堂资源av| 国产91在线观看丝袜 | 精品国产91久久久久久 | 国内免费av | 国产精品影音先锋 | 污片免费在线观看 | 天天色影 | 中文字字幕在线观看 | 国产情侣激情 | 免费成人激情视频 |