Egg.js構建一個stream流式接口服務

經常需要用到 stream 流式接口服務,比如:大文件下載、日志實時輸出等等。本文將介紹如何使用Egg.js構建一個 stream 流式接口服務。

Egg.js Stream API

一、準備工作

目錄結構:

app//controllerindex.jstest.txttest.sh
  1. index.js 控制器
  2. test.txt 測試文件,最好是20M以上的文件,這樣才能看出流式返回的效果
  3. test.sh 測試腳本,用于實時輸出日志的測試腳本

二、流式文件處理

  1. controller/index.js 文件內容如下:
'use strict';const Controller = require('egg').Controller;
const { createReadStream } = require('fs');
const { join } = require('path');class HomeController extends Controller {async testStream() {const { ctx } = this;ctx.set('Content-Type', 'text/plain; charset=utf-8');const stream = createReadStream(join(__dirname, './test.txt'));ctx.body = stream;}}module.exports = HomeController;

三、流式日志處理

  1. controller/index.js 文件內容如下:
'use strict';const Controller = require('egg').Controller;
const { createReadStream } = require('fs');
const { join } = require('path');
const { spawn } = require('child_process');class HomeController extends Controller {async testStream() {ctx.set('Content-Type', 'text/plain; charset=utf-8');const shPath = join(__dirname, './test.sh');const stream = spawn('sh', [ shPath ]);ctx.body = stream.stdout;}}module.exports = HomeController;
  1. controller/test.sh 文件內容如下:
#!/usr/bin/env shset -eint=1
while(( $int<=10 ))
doecho $intsleep 2let "int++"
done

四、測試

前端使用 fetch 方法進行測試,為什么不用 axios ?因為 axios 是基于 XMLHttpRequest 的,不支持流式接口。 具體實現請參考:前端實現 stream 流式請求


歡迎訪問:天問博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42284.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

5G+AI數字化智能工廠建設解決方案PPT

導讀&#xff1a;原文《5GAI數字化智能工廠建設解決方案》&#xff08;獲取來源見文尾&#xff09;&#xff0c;本文精選其中精華及架構部分&#xff0c;邏輯清晰、內容完整&#xff0c;為快速形成售前方案提供參考。數字化智能工廠定義 智能基礎架構協同框架 - 端、邊、云、網…

激光雷達 01 線數

一、線數 對于 360 旋轉式和一維轉鏡式架構的激光雷達來說&#xff0c;有幾組激光收發模塊&#xff0c;垂直方向上就有幾條線&#xff0c;被稱為線數。這種情況下&#xff0c;線數就等同于激光雷達內部激光器的數量[參考]。 通俗來講&#xff0c;線數越高&#xff0c;激光器的…

npm run xxx 的時候發生了什么?(以npm run dev舉例說明)

文章目錄 一、去package.json尋找scripts對應的命令二、去node_modules尋找vue-cli-service三、從package-lock.json獲取.bin的軟鏈接1. bin目錄下的那些軟連接存在于項目最外層的package-lock.json文件中。2.vue-cli-service文件的作用3.npm install 的作用 總結 一、去packag…

Google API實戰與操作

Google api實戰與操作 一. Google API 權限配置二. 操作API2.1 引入依賴2.2 導入代碼 Google官網 實現一套用java程序控制GoogleAPI實現自動生成監控日報等功能,具體能操作Gsheet及document 一. Google API 權限配置 打開上面官網,新建項目 啟用API 搜索sheet及document …

【山河送書第七期】:《強化學習:原理與Python實戰》揭秘大模型核心技術RLHF!

《強化學習&#xff1a;原理與Python實戰》揭秘大模型核心技術RLHF&#xff01; 一圖書簡介二RLHF是什么&#xff1f;三RLHF適用于哪些任務&#xff1f;四RLHF和其他構造獎勵模型的方法相比有何優劣&#xff1f;五什么樣的人類反饋才是好反饋&#xff1f;六如何減小人類反饋帶來…

LVGL圖層的介紹

一.UI界面顯示的圖層 在lvgl開發的過程中&#xff0c;UI界面的顯示都是位于lv_sct_act()圖層 二.彈窗顯示 lvgl開發過程中&#xff0c;有些窗口有可能在任何時候顯示&#xff0c;比如錯誤信息彈窗&#xff0c;外部觸發的一些中斷。 這個時候&#xff0c;這些窗口不能建立在lv_s…

web前端開發基礎入門html5+css3+js學習筆記(一)

目錄 1.第一個前端程序2.前端工具的選擇與安裝3.VSCode開發者工具快捷鍵4.HTML5簡介與基礎骨架4.1 HTML5的DOCTYPE聲明4.2 HTML5基本骨架4.2.1 html標簽4.2.2 head標簽4.2.3 body標簽4.2.4 title標簽4.2.5 meta標簽 5.標簽之標題5.1 快捷鍵5.1 標題標簽位置擺放 6.標簽之段落、…

LeetCode每日一題——2682. 找出轉圈游戲輸家

n 個朋友在玩游戲。這些朋友坐成一個圈&#xff0c;按 順時針方向 從 1 到 n 編號。從第 i 個朋友的位置開始順時針移動 1 步會到達第 (i 1) 個朋友的位置&#xff08;1 < i < n&#xff09;&#xff0c;而從第 n 個朋友的位置開始順時針移動 1 步會回到第 1 個朋友的位…

leetcode 377. 組合總和 Ⅳ

2023.8.17 本題屬于完全背包問題&#xff0c;乍一看和昨天那題 零錢兌換II 類似&#xff0c;但細看題目發現&#xff1a;今天這題是排列問題&#xff0c;而“零錢兌換II”是組合問題。排列問題強調順序&#xff0c;而組合順序不強調順序。 這里先說個結論&#xff1a;先遍歷物品…

并查集、樹狀數組

并查集、樹狀數組、線段樹 并查集樹狀數組樹狀數組1 (單點修改&#xff0c;區間查詢)樹狀數組2 (單點查詢&#xff0c;區間修改) 并查集 【模板】并查集 題目描述 如題&#xff0c;現在有一個并查集&#xff0c;你需要完成合并和查詢操作。 輸入格式 第一行包含兩個整數 …

Scala中的Either的用法

在 Scala 中&#xff0c;Either 是一種表示兩種可能值的數據類型。它可以用來處理函數可能返回的兩種不同類型的結果&#xff0c;通常用于錯誤處理或者結果分支情況。Either 有兩個子類&#xff1a;Left 和 Right&#xff0c;其中 Left 通常用于表示錯誤或異常情況&#xff0c;…

1.物聯網LWIP網絡,TCP/IP協議簇

一。TCP/IP協議簇 1.應用層&#xff1a;FTP&#xff0c;HTTP&#xff0c;Telent&#xff0c;DNS&#xff0c;RIP 2.傳輸層&#xff1a;TCP&#xff0c;UDP 3.網絡層&#xff1a;IPV4&#xff0c;IPV6&#xff0c;OSPF&#xff0c;EIGRP 4.數據鏈路層&#xff1a;Ethernet&#…

YOLOv5改進系列(21)——替換主干網絡之RepViT(清華 ICCV 2023|最新開源移動端ViT)

【YOLOv5改進系列】前期回顧: YOLOv5改進系列(0)——重要性能指標與訓練結果評價及分析 YOLOv5改進系列(1)——添加SE注意力機制 YOLOv5改進系列(2

兩階段提交:詳解數據庫宕機引起的主從不一致問題、redolog與binlog的兩階段提交

0、基礎知識and問題 從基礎上我們了解&#xff1a; &#xff08;1&#xff09;redolog作為數據庫保證持久化的日志&#xff0c;在update事務提交后就會按一定的策略刷入磁盤中&#xff0c;在刷入后&#xff0c;即使數據庫斷電宕機&#xff0c;mysql也能從redolog中恢復數據到磁…

Matplotlib數據可視化(六)

目錄 1.繪制概率圖 2.繪制雷達圖 3.繪制流向圖 4.繪制極坐標圖 5.繪制詞云圖 1.繪制概率圖 from scipy.stats import norm fig,ax plt.subplots() plt.rcParams[font.family] [SimHei] np.random.seed() mu 100 sigma 15 x musigma*np.random.randn(437) num_bins …

【騰訊云 Cloud Studio 實戰訓練營】在線 IDE 編寫 canvas 轉換黑白風格頭像

關于 Cloud Studio Cloud Studio 是基于瀏覽器的集成式開發環境(IDE)&#xff0c;為開發者提供了一個永不間斷的云端工作站。用戶在使用Cloud Studio 時無需安裝&#xff0c;隨時隨地打開瀏覽器就能在線編程。 Cloud Studio 作為在線IDE&#xff0c;包含代碼高亮、自動補全、Gi…

winform 設置畫刷半透明

使用solidBrush新建畫刷&#xff0c;定義畫刷的顏色為透明色 Brush b new SolidBrush(Color.FromArgb(50, Color.Green)); 這里的50是透明度的設置&#xff0c;范圍從0-255&#xff1b; 0:無顏色 255:不透明 轉&#xff1a;c# 設置Brush 畫刷 透明_solidcolorbrush 透明色_…

git-fatal: No url found for submodule path ‘packages/libary‘ in .gitmodules

文章目錄 前言一、git submodule功能使用二、錯誤信息&#xff1a;三、解決方法&#xff1a;四、.gitmodules配置文件&#xff1a;總結 前言 最近在做vue項目&#xff0c;因為項目比較復雜&#xff0c;把功能拆分成很多子模塊&#xff0c;我們使用Git的submodule功能。遇到錯誤…

使用libvncserver庫快速搭建VNC服務端

文章目錄 VNC是什么libvncserver的優點和缺點構建libvncserver使用libvncserver搭建VNCServerX11模擬鼠標鍵盤操作libvncserver中處理鼠標鍵盤消息 VNC是什么 VNC(Virtual Network Computing)是一種使用遠程幀緩沖協議(RFB)的屏幕分享及遠程操作軟件。VNC的服務端可以通過RFP協…

Linux開機啟動程序添加root權限

Linux添加開機啟動程序 Debain、Ubuntu系列Linux開機之后會執行/etc/rc.local文件中的命令&#xff0c;所以&#xff0c;如果是想添加登陸用戶所具有權限的操作&#xff0c;可以在文件中exit 0之前添加開機自動執行的腳本命令。或者將執行腳本的權限修改為當前登錄用戶具有執行…