欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-14 12:54:50
项目实践过程中,会使用非常多的静态资源,怎样可以直接在浏览器中访问到这些静态资源 const fs = require('fs'); const path = require('path'); module.exports = (dirpath = "./public") => { return a ......

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

    • 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目录来访问文件了

      • 参考文档  用来判断是否是一个文件夹