门户网站开发需求,网站建设平台选用,上海建设监理协会网站,sem工资经常需要用到 stream 流式接口服务,比如#xff1a;大文件下载、日志实时输出等等。本文将介绍如何使用Egg.js构建一个 stream 流式接口服务。 一、准备工作
目录结构#xff1a;
app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 测试文件#xff0c;最好…经常需要用到 stream 流式接口服务,比如大文件下载、日志实时输出等等。本文将介绍如何使用Egg.js构建一个 stream 流式接口服务。 一、准备工作
目录结构
app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 测试文件最好是20M以上的文件这样才能看出流式返回的效果test.sh 测试脚本用于实时输出日志的测试脚本
二、流式文件处理
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; charsetutf-8);const stream createReadStream(join(__dirname, ./test.txt));ctx.body stream;}}module.exports HomeController;三、流式日志处理
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; charsetutf-8);const shPath join(__dirname, ./test.sh);const stream spawn(sh, [ shPath ]);ctx.body stream.stdout;}}module.exports HomeController;controller/test.sh 文件内容如下
#!/usr/bin/env shset -eint1
while(( $int10 ))
doecho $intsleep 2let int
done四、测试
前端使用 fetch 方法进行测试为什么不用 axios ?因为 axios 是基于 XMLHttpRequest 的不支持流式接口。 具体实现请参考前端实现 stream 流式请求 欢迎访问天问博客