【学习Koa】原生koa2 静态资源服务器例子

实现思路

  • 首先读取当前路径下所有的文件和文件夹
  • 当去点击某个列表项时判断其实文件还是文件夹,文件的话直接读取,文件夹则再次利用上一个步骤读取并展示

文件结构

代码

index.js 入口文件

const Koa = require(‘koa‘)
const path = require(‘path‘)
const getContent = require(‘./util/content‘)
const mimes = require(‘./util/mimes‘)

const app = new Koa()

const staticPath = ‘./static‘

function parseMime(url) {
  let extName = path.extname(url)
  extName = extName ? extName.slice(1) : ‘unknown‘
  return mimes[extName]
}

app.use(async (ctx) => {

  if (ctx.path === ‘/favicon.ico‘) return;

  let absoluteStaicPath = path.join(__dirname, staticPath)
  let content = await getContent(ctx, absoluteStaicPath)
  let mime = parseMime(ctx.url)

  if (mime) {
    ctx.type = mime
  }

  if (mime && (mime.includes(‘image/‘) || mime.includes(‘video/‘))) {
    ctx.res.writeHead(200)
    ctx.res.write(content, ‘binary‘)
    ctx.res.end()
  } else {
    ctx.body = content
  }

})

app.listen(3000, function (params) {
  console.log(‘running at 127.0.0.1:3000‘)
})

content.js 获取内容

const fs = require(‘fs‘)
const path = require(‘path‘)
const dir = require(‘./dir‘)
const file = require(‘./file‘)

function getContent(ctx, absoluteStaticPath) {

  let reqPath = path.join(absoluteStaticPath, ctx.url)
  const exist = fs.existsSync(reqPath)
  let content = ‘‘

  if (!exist) {
    content = ‘404 not found‘
  } else {
    let status = fs.statSync(reqPath)

    if (status.isDirectory()) {
      content = dir(ctx.path, reqPath)
    } else {
      content = file(reqPath)
    }
  }

  return content
}

module.exports = getContent

file.js 读取文件

const fs = require(‘fs‘)

function file(reqPath) {
  return fs.readFileSync(reqPath, ‘binary‘)
}

module.exports = file

dir.js 读取文件夹

const walk = require(‘./walk‘)

function dir(path, reqPath) {

  let {
    dirList,
    fileList
  } = walk(reqPath)

  let html = ‘‘
  function category(path, type, list) {
    html += `<h2>${type}: </h2>`
    html += ‘<ul>‘
    for (const item of list) {
      html += `<li><a href="${path === ‘/‘ ? ‘‘ : path}/${item}">${item}</a></li>`
    }
    html += ‘</ul>‘
  }

  dirList.length && category(path, ‘文件夹‘, dirList)
  fileList.length && category(path, ‘文件‘, fileList)

  return html
}

module.exports = dir

walk.js 遍历目录,归类文件和文件夹

const fs = require(‘fs‘)
const mimes = require(‘./mimes‘)

function walk(reqPath) {

  const dirList = [], fileList = []
  const files =  fs.readdirSync(reqPath)

  for (const file of files) {
    // 判断文件是文件夹还是文件
    let file_split = file.split(‘.‘)
    // 根据mime类型判断, 因为文件夹的名字也中也是可以带有.的
    let mimeType = file_split.length > 1 ? file_split[file_split.length-1] : ‘‘

    if (mimes[mimeType] === void 0) {
      dirList.push(file)
    } else {
      fileList.push(file)
    }
  }

  return { dirList, fileList }
}

module.exports = walk

mimes.js

const mimes = {
  ‘css‘: ‘text/css‘,
  ‘less‘: ‘text/css‘,
  ‘txt‘: ‘text/plain‘,
  ‘html‘: ‘text/html‘,
  ‘xml‘: ‘text/xml‘,
  ‘js‘: ‘text/javascript‘,
  ‘json‘: ‘application/json‘,
  ‘pdf‘: ‘application/pdf‘,
  ‘wav‘: ‘audio/x-wav‘,
  ‘wmv‘: ‘video/x-mx-wmv‘,
  ‘gif‘: ‘image/gif‘,
  ‘jpeg‘: ‘image/jpeg‘,
  ‘jpg‘: ‘image/jpeg‘,
  ‘png‘: ‘image/png‘,
  ‘svg‘: ‘image/svg+xml‘,
  ‘tiff‘: ‘image/tiff‘,
  ‘icon‘: ‘image/x-icon‘,
  ‘mp4‘: ‘video/mp4‘
}

module.exports = mimes

结果

来源

原生koa2 静态资源服务器例子

原文地址:https://www.cnblogs.com/guanine/p/9348184.html

时间: 2025-01-08 20:04:53

【学习Koa】原生koa2 静态资源服务器例子的相关文章

Nginx——静态资源服务器(一)

java web的项目中,我们经常将项目部署到Tomcat或者jetty上,可以通过Tomcat或者jetty启动的服务来访问静态资源.但是随着Nginx的普及,用Nginx来作为静态资源服务器,似乎有着更高的性能.接下来的Nginx--静态资源服务器系列随笔,我想探讨以下几个问题: Nginx作为静态资源服务器,有什么优势? Nginx如何和tomcat结合起来使用? Nginx如何搭建CDN? 等等 静态资源是指非服务器运行动态生成的文件,主要包括浏览器端渲染(html.css.js).图片

使用node搭建静态资源服务器(2)

在上一篇使用node搭建静态资源服务器(1)中,我们已经实现了基本的功能,下面继续实现进阶功能. 静态资源的压缩 //compress.js module.exports = (rs,req,res) => { const acceptEncoding = req.headers['accept-encoding']; if(!acceptEncoding || !acceptEncoding.match(/\b(gzip|defalte)\b/)) { return rs; }else if(

静态资源服务器功能

/** * 静态服务器功能:核心模块HTTP * 初步实现服务器功能 */ const http = require('http'); //创建服务器实例对象 let server = http.createServer(); //绑定请求事件 server.on('request',(req,res) => { res.end('hello'); }); //监听端口 访问地址:localhost:3000 server.listen(3000); //====================

图片等静态资源服务器的设计和应用

最近网站需要上传一些图片,于是考虑做一个专门管理静态资源的服务: 归纳的实现有几点: 1,使用jsonp或http跨域上传(文件流传输): 2,本地上传并服务器之间同步: 3,本地上传,做目录映射(IIS?) 后来看到阿里云的OSS,小手一抖便注册使用了,只需要上传就可以访问了,不需要额外部署应用服务器,有java sdk,于是乎...(未完待续) 相关链接: http://www.aliyun.com/ http://free.aliyun.com/?tracelog=ECSmokuai#OS

web站点优化之使用tengine搭建静态资源服务器和静态资源合并加载案例剖析

在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构中静态资源这羊毛是出在单体架构这头羊身上,所以横向多少 个单体,就有多少个静态资源文件夹,比如下面这样的架构. 那这种架构有什么问题呢? 总的来说会有如下二个问题: 1.   浏览器对单一域名的请求有并发限制. 在同一个域名下,一般来说有js,css,img,media,html等等静态资源,如果资

nginx静态资源服务器简单配置

有时候我们可以把服务器的一些文件放在固定目录以便下载,比如image,css,js等.就可以使用nginx转发静态资源. 参考链接:https://blog.csdn.net/name_is_wl/article/details/52958472 原文地址:https://www.cnblogs.com/2YSP/p/9262539.html

HTTP静态资源服务器搭建

1.搭建服务器原因 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础.这个步骤是系统架构从猿进化成人的必经之路. 核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互. 在互联网架构中: Web服务器:一般指像nginx

nginx搭建静态资源服务器遇到403 Forbidden

1.在nginx中配置静态服务器 server { listen 91; server_name localhost; location / { root /root/software/qingfeng; index index.html; } } 这是我放静态资源的/root/software/qingfeng目录(注意:我这放在/root目录下) 我启动nginx时访问   ip地址:91时,访问不了,报403 Forbidden错误 2.我又从新在nginx中配置静态服务器 server

linux使用Nginx搭建静态资源服务器

最近公司需要做一个宣传片播放  视频有点大 好几百M 就想到使用Nginx来代理静态资源,在过程中出现了一些问题,比如端口没开.访问是403等,没有成功,后面慢慢查找问题,才发现大部分博客资料的都不全,所以在这里记录一下. 安装过程本文就不提了 网上都有很多 本文主要说明 nginx.conf 的配置 如下: 进入编辑nginx.conf 文件 输入密码 配置nginx.conf 上传文件到配置的路径 在网页地址栏输入对应的地址 如果出现 nginx静态资源文件无法访问,403 forbidde