TechBlog
首页分类标签搜索关于

© 2025 TechBlog. All rights reserved.

Node.js基础文件与路径处理

11/23/2025

Node.js基础:文件与路径处理

Node.js基础:文件与路径处理

@jarringslee

Node.js 入门

什么是Node.js:

Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序

Node.js作用:

  1. 编写数据接口,提供网页资源浏览功能等等
  2. 前端工程化 为后续学习vue ts 和React框架做铺垫

Node.js 内置很多模块,例如 fs(文件系统)、path(路径)、http(网络通信)等。

什么是前端工程化:

指开发项目直到上线,过程中集成的所有的工具和技术。Nodejs是前端工程化的基础(因为Nodejs可以主动读取并执行js代码)

为什么Nodejs能执行js:

首先 浏览器能执行js代码依靠的是内核中的V8引擎(C++程序)

nodejs基本用法:

  1. 命名并编写js文件: 1-实例.js

    const ljl = 18
    const cjx = 18
    console.log(ljl + cjx)
    let i = 1, j = i
    for (let i = 0; i < 4; i++) {
        console.log(j++)
    }
    
    
  2. node语法: node 文件名.js

    再改文件目录的终端中输入文件名

    PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 1-实例.js
    
    
  3. 终端输出如下

    36
    1
    2
    3
    4
    
    

fs模块 读写文件

模块:类似于插件,封装了方法或属性

fs模块:封装了与本级文件系统进行交互的方法或属性

语法:

  1. 加载fs模块对象

    const fs = require('fs') // fs是模块标识符:模块的名字
    
    
  2. 写入文件内容 fs.writeFile

    fs.writeFile('文件路径', '写入内容(最好是字符串)', err => {
    // 发生错误时的回调函数:写入出错时的错误信息
    })
    
    
  3. 读取文件内容 fs.readFile

     fs.readFile('文件路径', (err, data) => {
     // 读取后的回调函数
     // data是文件内容的buffer数据流
     })
    
    

应用实例:

// 1. 加载fs模块对象
const fs = require('fs')

// 2. 写入文件内容
fs.writeFile('./test.txt', 'hello,cjx&ljl!', (err) => {
    if (err) console.log(err)
    else console.log('success!')
})

// 3. 读取文件内容
fs.readFile('./test.txt', (err, data) => {
    if (err) console.log(err)
    // 这里的data是buffer: 十六进制数据流的对象
    // 需要用toString()函数转化为字符串形式
    else console.log(data.toString())
})

  1. 同目录中出现了“test.txt”文件;

  2. 终端内容:

    PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 2-fs读写文件.js
    success!
    hello,cjx&ljl!
    
    

path模块 路径处理

path.join() 是 Node 提供的一个路径拼接函数,作用是把多个路径片段拼接在一起,并根据系统规则(Windows 下是 \,Linux、IOS 是 /)规范化路径。

例如:

path.join('a', 'b', 'c') // 结果: 'a\b\c' (Windows)

path.join('111','aaa/js,'index.js') //结果:'111\aaa\js\index.js'

它还会自动识别:

  • .. 表示返回上一级目录;
  • . 表示当前目录。

在nodejs代码中,相对路径是根据终端所在路径查找的,而不是以资源管理器为起点查找。可能无法找到想要的文件。

如果在读取文件时写错了路径名(.../test.txt),就会报错:

PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 2-fs读写文件.js
[Error: ENOENT: no such file or directory, open 'C:\Users\lenovo\Desktop\ljlvscode\nodejs\...\test.txt'] {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Users\\lenovo\\Desktop\\ljlvscode\\nodejs\\...\\test.txt'
}
success!

所以在nodejs代码中,尽量使用绝对路径。

__dirname(有两个下划线) 内置变量:获取当前模块目录的绝对路径

console.log(__dirname) //C:\Users\lenovo\Desktop\ljlvscode\nodejs

步骤:

  1. 加载path模块

    const path = require('path')
    
    
  2. 使用path.join方法拼接路径

    path.join('路径1', '路径2', ...)
    
    
// 1. 加载fs模块对象
const fs = require('fs')

// 2. 写入文件内容(已有文件)

// 3. 读取文件内容
// 3.0 获取绝对路径(__dirname直接获取)
// 3.1 引入path模块对象
const path = require('path')
// 3.2 调用path.join()配合__dirname组成目标文件的绝对路径(替换了原来的'./test.txt')
fs.readFile(path.join(__dirname, '../test.txt'), (err, data) => {
    if (err) console.log(err)
    else console.log(data.toString())
})
console.log(__dirname) // 这个会先出来,因为刚才的都是函数内部调用的操作

C:\Users\lenovo\Desktop\ljlvscode\nodejs
hello,cjx&ljl!

文件读写小案例:压缩html文件

压缩一个文件中的html代码,并将其写入另一个html文件.

做法:把回车符 \r 换行符 \n 去掉,并用空格代替。

  1. 读取源html内容
  2. 正则表达式替换字符串
  3. 把处理好的字符串写入新的文件中
// 压缩一个文件中的html代码,并将其写入另一个html文件
// 做法:把回车符 \r 换行符 \n 去掉,并用空格代替。

// 1. 读取源html内容
const fs = require('fs')
const path = require('path')
fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
    if (err) console.log(err)
    else {
        // console.log(data.toString())

        // 2. 正则表达式替换字符串
        const htmlStr = data.toString()
        const resultStr = htmlStr.replace(/[\r\n]/g, '')
        // console.log(resultStr)

        // 3. 把处理好的字符串写入新的文件中
        // 自动读取文件。有就填入,没有就先创建再填入
        fs.writeFile(path.join(__dirname, '../js APIs/小练习/111node压缩版下班倒计时.html'), resultStr, err => {
            if (err) console.log(err)
            else console.log('成功!')
        })
    }
})

文件夹无法自动创建,需要提前手动创建。

注意,若要压缩成一行,文件中不能有“//”注释符,否则一行后面都会被注释掉。(可以用“/* … */”注释)

URL

URL: 统一资源定位符,简称网址 ,用于访问服务器里的资源

URL端口号与服务程序

	http://hmajax.itheima.net:80/api/province
	协议 //域名               :端口号/资源路径
	钥匙 //楼房地址           :房间号/ 物品位置等信息

其中, :80 为该网址的端口号 :标记服务器里不同功能的服务程序

端口号范围: 0 ~ 65535 之间的任意整数

但是 0 ~ 1023 和一些特定端口号被占用,编写服务程序时需避开始用

http协议默认访问80端口。

web服务程序: 用于提供网上信息浏览功能

http模块 创建web服务

需求:创建web服务并响应内容给浏览器

例如:在本地启动一个 Web 服务(相当于一个小网站服务器)

步骤:

  1. 加载 http 模块,创建 web 服务对象

    const http = require('http')
    
    

    引入了http模块对象(http也为nodejs中的内置模块),让我们能创建服务器

    const server = http.createServer()
    
    

    http.createServer() 会返回一个 “服务器对象”,起到一个监听器的作用,等待用户请求。

  2. 监听 request 请求事件,设置响应头和响应体

    server.on('request', (req, res) => {...})
    
    

    监听请求事件:当有人向服务器发起请求时(监听request事件,即浏览器访问 http://localhost:3000 ),就调用该函数。

    函数参数:

    参数全名作用
    reqrequest 请求对象包含浏览器发来的所有信息(请求头、路径、方法等)
    resresponse 响应对象用来返回信息给浏览器(响应头、响应体等)
    res.setHeader('Content-Type', 'text/plain; charset=utf-8')
    
    

    设置响应头:

    • ‘Content-Type’ 为固定参数
    • ‘text/plain; charset=utf-8’ 内容类型为普通文本;编码格式为utf-8(汉字)
    res.end('您好,欢迎使用 node.js 创建的 web 服务!');
    
    

    设置响应体:

    ​ 向浏览器发送响应内容(一段文本)且在网页上显示,并结束本次请求响应。

  3. 配置端口号并启动 web 服务

    server.listen(916, () => {
        console.log('web 服务已启动')
    })
    
    
  4. 浏览器请求 http://localhost:916 测试

    localhost 代表本机域名

使用nodejs在终端请求后,终端会一直处于该任务的待机状态的进程中等待请求,不会自己开启下一次命令。退出本次命令: ctrl + c

小案例:在浏览器中创建html文件

访问:

http://localhost:8080/下班倒计时.html

步骤:

  1. 基于http模块来创建web服务

    const fs = require('fs') //获取文件命令
    const path = require('path') //获取路径
    const http = require('http') 
    const server = http.createServer()
    
    
  2. 使用req.url获取请求资源路径,判断并读取 目标html文件 里字符串内容返回给请求方

    server.on('request', (req, res) => {
        const url = decodeURIComponent(req.url)
        if (url === '/下班倒计时.html') {
        //判断req.url获取的文件是否一致,网页会把汉字解码为百分号编码,我们需要提前给req.url加上decodeURIComponent()转为汉字
            fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
                if (err) console.log(err)
                else {
                    // 设置响应内容类型为超文本字符串,并读取目标文件中的字符串内容并返回给请求方
                    res.setHeader('Content-Type', 'text/html;charset=UTF-8')
                    res.end(data.toString())
                }
            })
        } else {
            // ......
        }
    })
    
    
    • const url = decodeURIComponent(req.url) 百分比编码转汉字

    如果不想这样写,也可以直接把汉字转为百分比编码进行判断:

       if (req.url === '/%E4%B8%8B%E7%8F%AD%E5%80%92%E8%AE%A1%E6%97%B6.html') {
            fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
                if (err) console.log(err)
                else {
                    // ....
                }
            })
        }
    
    
  3. 对于其他路径,暂时返回不存在的提示

    if (...) {
    } else {
            // 对于其他路径,暂时返回报错
            res.setHeader('Content-Type', 'text/html;charset=UTF-8')
            res.end(`<b>你要访问的资源路径不存在</b>`)
        }
    
    
  4. 运行web服务,用浏览器发起请求

    server.listen(8080, () => {
        console.log('服务启动成功!')
    })
    
    

    1

// 基于http模块 创建web服务
const fs = require('fs') //获取文件命令
const path = require('path') //获取路径
const http = require('http') 
const server = http.createServer()


server.on('request', (req, res) => {
    //  使用req.url获取请求资源路径,并读取 文件名.html 里字符串内容并返回给请求对方
    // if (req.url === '/%E4%B8%8B%E7%8F%AD%E5%80%92%E8%AE%A1%E6%97%B6.html') {


    const url = decodeURIComponent(req.url)
    if (url === '/下班倒计时.html') {
        fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
            if (err) console.log(err)
            else {
                // 设置响应内容类型为超文本字符串,并读取目标文件中的字符串内容并返回给请求方
                res.setHeader('Content-Type', 'text/html;charset=UTF-8')
                res.end(data.toString())
            }
        })
    } else {
        // 对于其他路径,暂时返回报错
        res.setHeader('Content-Type', 'text/html;charset=UTF-8')
        res.end(`<b>你要访问的资源路径不存在</b>`)

    }
})

server.listen(8080, () => {
    console.log('服务启动成功!')
})