myfreax

在koa的Response返回Stream

Stream是Nodejs对数据流抽象的接口,不是数据类型,stream的概念来自Unix哲学思想,它可以很好控制的数据的转换和流向,在Unix&Linux中我们可以很简单的使用管道操作符`|`把数据交给另外程序进行处理,对数据进行压缩,编码,过滤等操作,在Nodejs中我们可以使用stream接口的Pipe()方法对数据进行操作

1 min read
By myfreax
在koa的Response返回Stream

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;
    }