学习Node.js 第一天笔记Node.js常用内置模块,fs模块,path模块,http模块
文章目录
fs文件系统模块
什么是fs文件系统模块
fs模块时node.js官方提供的 , 用来操作文件的模块 , 他提供了一系列的方法和属性 , 用来满足用户对文件的操作需求
例如
fs.readFile()
, 用来读取指定文件中的内容fs.writeFile()
用来向指定文件中写入内容
读取指定文件中的内容
fs.readFile(path,[options],callback);
path
必选参数, 表示文件的路径options
可选参数 , 表示以什么编码格式来读取文件callback
回调函数 , 通过此函数拿到读取的结果
使用fs模块的前提是在代码中导入该模块
const fs = require('fs');
使用fs.readFile()读取文件内容
const fs = require('fs'); fs.readFile('./files/test.txt','utf8',function(err,dataStr){ if(err){ return console.log('文件读取失败'+err.message); } console.log('文件读取成功'+dataStr); }) /* 此处的回调函数有两个参数 第一个参数err : 是文件读取失败的返回值 , 若文件读取成功则err=null,否则err为错误对象 第二个参数dataStr: 是文件内容字符串 , 若文件读取成功 , 则dataStr是字符串, 若文件读取失败则是undefined */
向指定文件中写入内容
fs.writeFile(file,data,[options],callback);
file
文件路径data
要写入的内容 , 是一个字符串options
可选参数, 可以指定以什么编码格式写入文件内容,默认是utf8callback
回调函数- 待写入的文件不存在时,会自动创建该文件
const fs = require('fs'); fs.writeFile('./files/test.txt', 'hello node.js!', function (err) { if (err) { return console.log('文件写入失败' + err.message); } console.log('文件写入成功'); } ) /* 此处的回调函数只有一个err err: 如果写入成功, 则err=null , 否则 err=一个错误对象 写入时会重新删除原来的内容 */
注意:
fs.writeFile()
只能用于创建文件, 不能用于创建路径fs.writeFile()
新写入的内容会覆盖旧的内容
动态路径拼接
在使用fs.readFile()
和 fs.writeFile()
方法时 , 若传入的参数是一个相对路径,即路径中带有./
或者../
, 那么在执行时很容易发生错误
这是因为node
命令是在当前目录下的一个命令,所以会发生错误
解决方案: 直接提供绝对路径
'd:\\test\\node\\hello.js' 这样的路径是一个写死的字符串, 且不易移植 , 维护性较差
那么可以使用一个专门的对象, 专门用来提供当前的绝对路径
__dirname
表示当前的绝对路径, 我们只需要拼接上待执行文件的文件名即可
console.log(__dirname); fs.readFile(__dirname+'/file/test.txt'); 但是使用加号也会出现拼接错误的问题 例如 fs.readFile(__dirname+'./file/test.txt'); console.log(__dirname+'./file/test.txt'); 这样这个路径就变成了 d:\test\.\file\test.txt 这样显示是不正确的路径
接下来的path
模块为我们提供了一个路径拼接的方法
path路径模块
什么是path路径模块
path
模块是Node.js官方提供的, 用来处理路径的模块,他提供了一系列的方法和属性,用来满足用户对路径的处理需求
例如,常用的
path.join()
用来将多个路径片段拼接成一个完整的路径字符串path.basename()
用来从路径字符串中, 将文件名解析出来
还是一样, 想要在代码中使用path
模块, 需要导入
const path = require('path');
路径拼接
在上面讲到的__dirname
时 , 使用+
号 拼接也会出现问题, 那么path.join()
就解决了这个问题
使用path.join()
, 可以把多个片段拼接成一个完整的路径字符串
path.join([...paths]);
...paths
多个路径的片段- 返回值是一个
string
字符串 - 使用
path.join()
就可以避免使用+
号带来拼接路径错误
const path = require('path'); var pathStr = path.join('/a','/b/c','../','./d','e'); console.log(pathStr) var pathStr2 = path.join(__dirname,'./files/test.txt'); console.log(pathStr2); /* 会自动的去识别 ../ 和 ./ 自动的完成拼接 */
获取路径中的文件名
使用path.basename()
方法可以获取路径中的最后一部分 , 经常通过这个方法获取路径中的文件名
path.basename(path[,ext]);
path
必选参数, 表示一个路径的字符串ext
可选参数 , 表示文件拓展名, 指定了拓展名之后,就不会返回文件的后缀, 只返回文件名- 返回值一个
string
字符串
var fpath = '/a/b/c/index.html'; var fullName = path.basename(fpath); console.log(fullName); //输出index.html var nameWithoutExt = path.basename(fpath,'.html'); console.log(nameWithoutExt); //输出index
获取路径中的文件拓展名
使用path.extname()
方法 , 可以获取路径中的拓展名部分
path.extname(path);
path
必选参数 , , 路径的字符串- 返回一个
string
字符串
const path = require('path') var fext = path.extname(fpath) console.log(fext); //输出.html
http 模块
什么是http模块
首先要知道什么是客户端和服务器
在网络中, 负责消耗资源的电脑叫做 客户端 , 负责对外提供网络资源的电脑 , 叫做服务器
http
模块是Node.js官方提供的, 用于创建Web服务器的模块 , 通过调用提供的http.createServer()
方法 , 就能方便的把电脑变成服务器 , 从而对外部提供Web资源
还是老样子 , 要想使用http模块, 需要导入
const http = require('http');
进一步了解http模块的作用
服务器和客户端的区别在于 , 服务器上安装了web服务器软件 , 例如: IIS
, Apache
, 通过安装这些服务器软件,就能把电脑变成服务器
在Node.js 中 , 我们不需要使用IIS
, Apache
等这些第三方web服务器软件
因为我们可以基于Node.js提供的http模块 , 通过简单的代码 , 就能轻松的手写一个服务器软件 ,
从而对外提供web服务
服务器相关的概念
IP地址
IP 地址就是互联网上每台计算机的唯一地址
常用的是IPv4的地址格式 , a.b.c.d
,其中每个字母都是0~~255
之间的十进制整数
例如
- 本地回环地址
127.0.0.1
, 代表本地主机 - 路由地址
192.168.0.1
注意
- 互联网中的每台服务器 , 都有自己的IP地址 , 例如可以在终端中
ping www.baidu.com
, 查看百度服务器的IP地址 - 在开发期间 , 自己的电脑既可以是服务器, 也可以是客户端 , 可以在浏览器中输入
127.0.01
,把自己的电脑当做服务器访问
域名和域名服务器
IP地址不方便记忆, 不直观易懂 , 所以又出现了域名,例如www.baidu.com
就是百度服务器IP地址的映射的域名 , 相对于百度的IP地址 , 域名更方便我们记忆理解,我们可以通过域名来访问百度的服务器
域名和IP地址是一一对应的关系 , 根据域名解析出对应的IP地址, 就需要用到一个域名服务器
注意
- 单纯地使用IP地址 , 互联网中的电脑是能够正常工作的 , 但是有了域名 , 能够让互联网世界变得更加方便
- 在开发测试期间 ,
127.0.0.1
对应的域名就是localhost
,代指本机
端口号
电脑上的端口是用来放程序的地方 , 也可以理解为服务程序存放的端口
每个电脑上可以有很多服务,每个服务都对应一个端口
客户端发过来的网络请求, 通过端口号, 可以被准确地交给对应的Web服务进行处理
端口号就是用来辨别电脑上的端口
注意
- 每个端口号不能同时被多个web应用占用
- 在实际应用中 , 如果web服务器的端口号为80 , 则URL中的80端口可以被省略 , 只有80端口号是可以省略的, 其他不行!!!
创建最基本的Web服务器
基本步骤
- 导入
http
模块 - 创建web服务器实例
- 为服务器实例绑定
request
事件, 监听客户端的请求 - 启动服务器
// 1.导入http模块 const http = require('http') // 2. 创建web服务器实例 const server = http.createServer(); // 3. 为服务器实例绑定request事件, 监听客户端请求 server.on('request',function(){ ..... }) //4.启动服务器, server.listen(80,function(){ .,... })
req请求对象
只要我们服务器接收到了客户端的请求, 就会调用通过server()
为服务器绑定的request
事件处理函数
如果想访问客户端相关的数据 或属性
server.on('request',(reg) => { // req 是请求对象 , 他包含了客户端相关的数据和属性 // 例如 req.url 表示客户端请求的url地址 // req.method 是客户端请求类型 const str = `Your request url is ${req.url} , and request method is ${req.method}` console.log(str) })
res响应对象
在服务器的request事件处理函数中 ,如果想访问与服务器相关的数据或属性
server.on('request',(reg,res) => { // res是响应对象 ,他包含了服务器相关的数据和属性 // 例如 ,要发送到客户端的字符串 //此处的req.url是 URL中端口号后面的部分 const str = `Your request url is ${req.url} , and request method is ${req.method}` //res.end()方法的作用 // 向客户端发送指定的内容 , 并结束这次请求的处理 res.end(str); })
解决中文乱码问题
当调用res.end()
方法 ,向客户端发送中文内容的时候, 会出现乱码问题 , 因此需要手动设置内容的编码格式
server.on('request',(reg,res) =>{ //发送的内容中包含中文 const str = '您请求的地址是 ${req.url} , 请求的method类型是 ${req.method}' // 为了防止中文乱码问题 , 需要手动设置响应头的编码格式 res.setHeader('Content-Type','text/html; charset=utf-8') // 把包含中文的内容响应给客户端 res.end(str) })
根据不同的URL响应不同的HTML内容
核心步骤
- 获取请求的URL地址
- 设置默认的响应内容为 404 Not found
- 判断用户请求是否为
/
或/index.html
首页 - 判断用户请求的是否为
/about.html
页面 - 设置
Content-Type
响应头 , 防止中文乱码 - 使用
res.end()
把内容响应给客户端
server.on('request',(req , res)=>{ const url = req.url // 1. 获取请求地址 let content = '<h1>404 not found</h1>'//2.设置默认的内容 if(url === '/' || url === 'index.html')//3如果用户请求的是首页 { content = '<h1>首页</h1>' }else if(url === '/about.html'){//4. 如果用户请求的是关于页面 content='<h1>关于页面</h1>' } //5.设置响应头 , 防止中文乱码 res.setHeader('Content-Type','text/html; charset=utf-8'); //6.把内容发送给客户端 res.end(content); })
声明
本人结合黑马程序员的Node.js教学视频整理的学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现