koa-static源码简单实现分析

const Koa = require('koa');
const app = new Koa();

// 静态资源
// const staticServer = require('koa-static');

app.use(staticServer('./static'))
app.use(staticServer('./static/img'))


const server = app.listen(8899, (res) => {
  console.log('服务已启动...')
})
console.log(server.address().port)
// koa-static
// 解析保存root 返回中间件
// 中间件中 调用koa-send 参数为ctx, 请求path, root等参数

const send = require('koa-send')
const server = (root, opts = {}) => {
  opts.root = resolve(root)
  return async function serve(ctx, next) {
    await next()
    if (ctx.method !== 'HEAD' && ctx.method !== 'GET') return
    if (ctx.body != null || ctx.status !== 404) return
    try  {
      await send(ctx, ctx.path, opts)
    } catch(error) {
    }
  }
}
module.export = server
// koa-send
/**
 * koa-send
 * 解析root path 找到资源地址
 * 根据地址判断文件是否存在
 * 返回资源 ctx.body = fs.createReadStream(path)
 */
const fs = require('fs');
const fsPromise = fs.promises;
const { stat, access } = fsPromise;
const { resolve, normalize, basename, extname, parse, sep, format } = require('path')
function decode(path) {
  try {
      return decodeURIComponent(path)
  } catch (err) {
      return -1
  }
}

const send = async(ctx, path, opts = {}) => {
  const root = opts.root ? normalize(resolve(opts.root)) : '';
  path = decode(path)
  if (path === -1) return ctx.throw(400, 'failed to decode');
  // console.log(root, path)
  path = resolve(root, path)
   // console.log('filepath : ', path)
  let stats
  try {
    stats = await stat(path)
  } catch (err) {
    err.status = 500
    throw err
  }

  ctx.set('Content-Length', stats.size)
  if (!ctx.type) ctx.type = extname(path)
  ctx.body = fs.createReadStream(path)
  return path
}

module.export = send

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值