Stream是Nodejs对数据流抽象的接口,不是数据类型,stream的概念来自Unix哲学思想,它可以很好控制的数据的转换和流向,在Unix&Linux中我们可以很简单的使用管道操作符|
把数据交给另外程序进行处理,对数据进行压缩,编码,过滤等操作,在Nodejs中我们可以使用stream接口的Pipe()方法对数据进行操作
static *index() {
let captcha = yield captchaCodeApi.genCaptcha();
this.session.captcha = captcha.code;
return captcha.src.pipe(this.res);
}
以上这个示例非常简单,使用canvas生成的图像可读流,由于Response是一个可写流,因此只需要使用管道Pipe
流向Response并响应到客户端,但在Koa中你可能会遇到以下问题
Error: [Error: Can't set headers after they are sent.]
即不能在发送响应之后再来设置Response Header,由于Koa的默认状态码是404,导致koa在发送Response时不能设置Response Header
解决方式:
static *index() {
this.status = 200;
let captcha = yield captchaCodeApi.genCaptcha();
this.session.captcha = captcha.code;
return captcha.src.pipe(this.res);
}
如果不是大文件也可以不使用Pipe
管道操作符,只需要把stream设置给this.body即可
static *index() {
let captcha = yield captchaCodeApi.genCaptcha();
this.session.captcha = captcha.code;
return this.body = captcha.src;
}