koa简易框架(三)

koa-static

之前我们实现了koa,koa-router,现在我们来看一下koa-static实现思路

源码
const fs = require('fs');
const {promisify} = require('util');    //将函数promise化
const stat = promisify(fs.stat);    //用来获取文件的信息
const mime = require('mime');   //mime类型获取插件
const path = require('path');
let EventEmitter = require('events');

class Static extends EventEmitter{
    constructor() {
        super();
        this.path = null;
    }

    read(dir){
        return async (ctx, next) => {
            let pathname = this.path = ctx.path;
            // 请求文件的绝对路径
            let realPath = path.join(dir, pathname);
            try{
                let statObj = await stat(realPath)           
                if(statObj.isFile()){
                	//如果是文件则读取文件,并且设置好相应的响应头
                    await ctx.setHeaders('Content-Type', mime.getType(realPath)+";charset=utf-8");
                    ctx.contentType = mime.getType(realPath)
                    ctx.body = fs.createReadStream(realPath)
                }
                else{
                    //如果不是文件,则判断是否存在index.html
                    let filename = path.join(realPath, 'index.html');
                    await stat(filename);
                    ctx.setHeaders('Content-Type', "text/html;charset=utf-8");
                    ctx.body = fs.createReadStream(filename);
                }
            }
            catch(e){
                await next();   //交给后面的中间件处理
            }
        }
    }
}
module.exports = Static;

调用方式

const Koa = require('./lib/application');
const Static = require('./lib/static');
const path = require('path');
const app = new Koa();
const static = new Static();

app.use(router.routes());
app.use(static.read(path.resolve(__dirname,'public')))
app.listen(3000);

在public目录下新建txt,jpg,json文件,可以分别访问,访问地址http://localhost:3000/文件名称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值