
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.4.2 koa-send
其实,为上面的package.json提供HTTP服务是非常简单的,在Koa里,可以像下面这样实现。这里主要是为了读取文件,设置Content-Type。

这个示例仅针对package.json进行操作,如果我们要读取某个目录下(含子目录)的所有文件,这样写起来很明显是不优雅的。另外,文件是否存在,异常如何处理等,也是需要考虑的。
koa-send做的就是这件事——提供一个相对完善且小而美的处理静态文件的Koa中间件,同样提供对package.json的HTTP服务,用法如下。

这里直接返回了一个文件,我们也可以通过root选型指定目录,这样就和koa-static一样了。
翻看一下koa-send的源码,其实现原理也是非常简单的。

其中ctx.type是根据文件后缀来设置Content-Type的便捷方法,代码如下。

至此,koa-send原理已经讲解完毕,总结如下。
○ 设置Content-Type,可通过文件后缀进行设置。
○ 以Stream的形式为ctx.body赋值,这种方式比fs.readFileSync更高效。
其实,Koa的API设计得是非常人性化的,其中的很多小细节,乃至API粒度,都非常值得研究。