node静态服务器实现静态读取文件或文件夹

 更新时间:2019年12月03日 09:41:46   作者:XguangY  
这篇文章主要介绍了node静态服务器实现静态读取文件或文件夹,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

现在我们已经大致了解了node 的基本工作原理,现在来实现一个系统的功能 读取文件或者文件夹

采坑记录

中文输出乱码问题

res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('啊啊和嘎哈啊')

输出中出现中文乱码 附解决方案 ~

res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })

res.writeHead(200, { 'Context-Type': 'text/plain' })
res.write('<head><meta charset="utf-8"/></head>')

文件读取方式

node 允许通过两种方式读取并输出文件

one : 以文件流的形式读取与返回一起进行,快 = 推荐

fs.createReadStream(filePath).pipe(res)

two : 先将文件整个读取,然后将文件内容一起返回,简单说这就是api的蹩脚使用 = 慢

fs.readFile(filePath, (err, data) => {
  if (err) return
  res.end(data)
})

读取文件或者文件夹

废话不说,上代码

require('./config/defaultConfig') 更新为以下

  module.exports = {
   // 主机名称
   hostname: '127.0.0.1',
   // 端口号
   port: 6969,
   // 当前文件夹
   root: process.cwd()
  }

  // 引入http内置模块
  const http = require('http')
  
  // 引入chalk 用于美化后台打印
  const chalk = require('chalk')
  
  const path = require('path')
  const fs = require('fs')
  // 引入基本配置
  const conf = require('./config/defaultConfig')
  
  // 创建一个server 实例
  const server = http.createServer((rep, res) => {
   // 拿到路径
   const filePath = path.join(conf.root, rep.url)
  
   // 判断是否为文件或者文件夹
   fs.stat(filePath, (err, stats) => {
    // 设置公共头部信息
    res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
    if (err) {
     // 状态码
     res.statusCode = 404
  
     // 找不到提示文本
     res.end(`${filePath} is 404`)
  
     return
    }
    if (stats.isFile()) {
     // 如果是文件 返回文件内容
     res.statusCode = 200
  
     fs.createReadStream(filePath).pipe(res)
    } else if (stats.isDirectory()) {
     // 如果是文件夹,返回文件列表
     fs.readdir(filePath, (err, files) => {
      if (err) return
      res.statusCode = 200
  
      res.end(files.join(','))
     })
    }
   })
  })
  
  // 监听 server 实例
  
  server.listen(conf.port, conf.hostname, () => {
   const addr = `http:// ${conf.hostname}:${conf.port}`
  
   console.info(`server startd at ${chalk.green(addr)}`)
  })

代码优化

上述代码存在很多回调,代码臃肿可读性差。下面利用异步将回调去除,达到优化效果

require-atomic-updates 注意eslint对于此项的限制, 为此将实参await 

const fs = require('fs')

const promisify = require('util').promisify
const stat = promisify(fs.stat)
const readdir = promisify(fs.readdir)

module.exports = async function(rep, res, filePath) {
 // 规避此问题require-atomic-updates报告在异步函数中重新分配变量时可能发生的竞争条件错误
 const awaitRes = await res
 awaitRes.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
 try {
  const stats = await stat(filePath)
  if (stats.isFile()) {
   // 如果是文件 返回文件内容
   awaitRes.statusCode = 200

   fs.createReadStream(filePath).pipe(awaitRes)
  } else if (stats.isDirectory()) {
   // 如果是文件夹,返回文件列表
   const file = readdir(filePath)
   awaitRes.statusCode = 200

   awaitRes.end(file.join(','))
  }
 } catch (ex) {
  // 状态码
  awaitRes.statusCode = 404

  // 找不到提示文本
  awaitRes.end(`${filePath} is 404`)
 }
}

app.js文件变更为

// 引入http内置模块
const http = require('http')

// 引入chalk 用于美化后台打印
const chalk = require('chalk')

const path = require('path')

const route = require('./header/route')
// 引入基本配置
const conf = require('./config/defaultConfig')

// 创建一个server 实例
const server = http.createServer((rep, res) => {
 // 拿到路径
 const filePath = path.join(conf.root, rep.url)
 route(rep, res, filePath)
})

// 监听 server 实例

server.listen(conf.port, conf.hostname, () => {
 const addr = `http:// ${conf.hostname}:${conf.port}`

 console.info(`server startd at ${chalk.green(addr)}`)
})

至此实现了通过hash路径输入,实现文件或文件夹的读取/前进后退

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • node.js基于dgram数据报模块创建UDP服务器和客户端操作示例

    node.js基于dgram数据报模块创建UDP服务器和客户端操作示例

    这篇文章主要介绍了node.js基于dgram数据报模块创建UDP服务器和客户端操作,结合实例形式分析了node.js使用dgram数据报模块创建UDP服务器和客户端,以及进行UDP广播、组播相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • Node.js 中正确使用 async/await 与 Promise 对象配合(操作方法)

    Node.js 中正确使用 async/await 与 Promise 

    在Node.js中,async/await是ES2017引入的一种更简洁的处理异步操作的方式,它基于Promise来进行编写,使得异步代码看起来更像同步代码,易于理解和维护,这篇文章主要介绍了Node.js 中正确使用 async/await 与 Promise 对象配合,需要的朋友可以参考下
    2024-07-07
  • node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    今天小编就为大家分享一篇关于node.js中ws模块创建服务端和客户端,网页WebSocket客户端,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • NodeJs Express框架操作MongoDB数据库执行方法讲解

    NodeJs Express框架操作MongoDB数据库执行方法讲解

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型
    2023-01-01
  • 快速查询nodejs版本信息的六种方法

    快速查询nodejs版本信息的六种方法

    Node.js是一款基于Chrome V8引擎的快速、轻量级的JavaScript运行时,随着应用程序规模越来越庞大,Node.js版本的更新也日益频繁,这篇文章旨在帮助开发者们快速查询Node.js版本信息,需要的朋友可以参考下
    2023-11-11
  • Node Express用法详解【安装、使用、路由、中间件、模板引擎等】

    Node Express用法详解【安装、使用、路由、中间件、模板引擎等】

    这篇文章主要介绍了Node Express用法,结合实例形式详细分析了node.js Express安装、使用、路由、中间件、模板引擎等相关概念、原理及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • node.js操作mongoDB数据库示例分享

    node.js操作mongoDB数据库示例分享

    这里给大家分享的是node.js操作mongoDB数据库的示例,包括连接数据库、插入数据、关闭数据库、读取数据、插入数据等方面,十分的全面,这里推荐给需要的小伙伴们。
    2014-11-11
  • windows离线环境安装node-sass全过程

    windows离线环境安装node-sass全过程

    文章介绍了如何在Windows系统上安装和配置node-sass,并提供了一个详细的步骤指南,首先,通过命令行查看支持版本;然后,下载对应版本的node-sass安装包;接着,在npm配置文件中增加SASS_BINARY_PATH路径配置;最后,执行npmi命令完成安装
    2024-12-12
  • Node的事件处理和readline模块详解

    Node的事件处理和readline模块详解

    这篇文章主要为大家详细介绍了Node的事件处理和readline模块,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 我的NodeJs学习小结(一)

    我的NodeJs学习小结(一)

    既然是我的技术总结,那就是以我的技术水平为基础的,写浅了大家不要笑话,如果有错误的地方还望指正。
    2014-07-07

最新评论