koa中静态文件资源中间件实现

时间:2023-03-09 17:24:07
koa中静态文件资源中间件实现

项目实践过程中,会使用非常多的静态资源,怎样可以直接在浏览器中访问到这些静态资源

    • const fs = require('fs');
      const path = require('path'); module.exports = (dirpath = "./public") => {
      return async (ctx, next) => {
      if (ctx.url.indexOf("/public") === 0) {
      //public 开头 读取文件
      const url = path.resolve(__dirname, dirpath);
      // path.basename(p, [ext])
      // 提取出用‘/’隔开的path的最后一部分,ext是过滤字符
      // path.basename('/foo/bar/baz/asdf/quux.html', '.html')
      // returns
      // 'quux'
      const fileBaseName = path.basename(url); // public
      const filepath = url + ctx.url.replace("/public", ""); //得到文件目录
      console.log(filepath); try {
      //判断是否是一个文件夹
      stats = fs.statSync(filepath);
      if (stats.isDirectory()) {
      const dir = fs.readdirSync(filepath);
      console.log(dir); // [ 'index.html', 'style.css' ] const ret = ['<div style="padding-left">'];
      dir.forEach(filename => {
      console.log(filename);
      //不带小数点的格式,就是文件夹
      if (filename.indexOf(".") > -1) {
      ret.push(
      `<p><a style="color:black" href="${ctx.url}/${filename}">${filename}</a></p>`)
      } else {
      //文件
      ret.push(`<p><a href="${ctx.url}/${filename}">${filename}</a></p>`)
      } });
      ret.push("</div>")
      ctx.body = ret.join("");
      } else {
           //访问到的是一个文件,则直接读取内容
      console.log('文件');
      const content = fs.readFileSync(filepath);
      ctx.body = content;
      } } catch (error) {
      ctx.body = "404 ,not found";
      console.log(error); }
      } else {
      //否则不是静态资源,直接去下一个中间件
      await next();
      }
      }
      }

      同时在我们的app文件中添加中间件的引用

    • const static = require('./static');
      app.use(static('./public'));

      便可以在浏览器中使用public目录来访问文件了