NodeJs-内置模块
@
系统模块fs--文件操作
f(file)s(system):文件操作系统
fs 文件系统 | Node.js API 文档 (nodejs.cn)
require('fs')#
想要使用node.js系统模块中的 fs系统模块
,首先需要在当前模块中引入 fs
。
const fs = require('fs');
fs.readFile()#
fs.readFile(path[, options], callback);
功能:读取指定文件中的内容
格式:
fs.reaFile('文件路径/文件名称'[,'文件编码'], callback);
fs.readFile(path[, options], callback)
参数说明:
- path : 必选,字符串,表示文件路径
- options: 可选,表示以什么 编码格式 来读取文件
- callback: 必选, 文件读取完毕后, 通过回调函数
callback
拿到读取结果
举例:
//readFile.js
//示例:以utf-8的编码格式,读取上一级css目录下中的base.css并获取返回结果
const fs = require('fs');
fs.readFile('../css/base.css', 'utf-8', (err, dataStr) => {
if(err == null){
console.log("文件读取成功, 内容为: " + dataStr);
//如果成功读取文件,返回读取文件结果
return dataStr;
}else {
//文件读取失败,输出错误对象,(err.message -> 错误简要信息)
console.log(err);
}
}
)
callback 中的参数(err, doc) 说明
err:
- 如果文件读取失败,参数err值:一个包含错误信息的对象
- 如果文件读取成功,参数err值:null
dataStr:是文件读取的结果
可见,node api 中的 callback 是以 错误优先 的回调函数
运行结果:
通过promise处理读取文件异操作#
const fs = require('fs');
function p1() {
return new Promise((resolve, reject) => {
fs.readFile('./1.txt', 'utf8', (err, result) => {
resolve(result)
})
});
}
function p2() {
return new Promise((resolve, reject) => {
fs.readFile('./2.txt', 'utf8', (err, result) => {
resolve(result)
})
});
}
function p3() {
return new Promise((resolve, reject) => {
fs.readFile('./3.txt', 'utf8', (err, result) => {
resolve(result)
})
});
}
//链式技巧
p1().then((r1) => {
console.log(r1);
return p2();
})
//引用对象为上个then方法总参数匿名函数的返回值
.then((r2) => {
console.log(r2);
return p3();
})
.then((r3) => {
console.log(r3)
})
p1().catch((e1) => {
console.log(e1);
return p2();
})
//引用对象为上个catch方法总参数匿名函数的返回值
.catch((e2) => {
console.log(e2);
return p3();
})
.catch((e3) => {
console.log(e3)
})
fs.writeFile()#
fs.writeFile(file, data[, options], callback)
功能:向指定的文件中写入内容
格式:
fs.writeFile(file, data[, options], callback)
参数说明:
- file: 必选,文件路径的字符串,表示文件的存放路径
- data: 必选,表示要写入的内容
- options: 可选,表示以什么格式写入文件内容,默认值为
utf-8
- callback: 必选, 文件写入完成之后的回调函数
举例:
//writeFile.js
//示例:在当前目录下的index.html文件内写入内容
const fs = require('fs');
const content = '<h3>正在使用fs.writeFile写入文件内容</h3>';
fs.writeFile('./index.html', content, err => {
//如果该目录下这个文件不存在,系统会自动创建该文件
if(err != null){
//文件内容写入失败
console.log(err);
console.log("-------------");
console.log(err.message)
return;
}
console.log('文件写入成功');
fs.readFile('../index.html', 'utf-8', (err, dataStr) => {
console.log(dataStr);
})
})
callback 的参数 err 说明:
- 如果文件写入成功,err值:null
- 如果文件写入失败,err值:一个包含错误信息的对象
fs.writeFile()
方法只能用来创建文件(当指定文件不存在时),不能用来创建路径- 重复调用
fs.writeFile()
写入同一个文件,新写入的内容会覆盖之前的旧内容
fs 模块 - 路径动态拼接的问题#
在使用 fs 模块操作文件时,如果提供的操作路径是以 ./ 或 ../ 开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径。
解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,不要提供 ./ 或 ../ 开头的相对路径,从而防止路径动态拼接的问题。
//不要使用 ./ 或 ../ 这样的相对路径
fs.readFile('./files/1.txt', 'uft-8', function(err, dataStr){
})
// 使用完整的路径
fs.readFile(__dirname + '/files/1.txt', 'uft-8', function(err, dataStr){
})
系统模块path--路径操作
global.__dirname#
作用:返回当前模块的绝对路径
相对路径VS绝对路径#
- 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录
- 在读取文件或者设置文件路径时都会选择绝对路径
- 使用
__dirname
获取当前文件所在的绝对路径 require()
方法里可以写相对路径,是相对当前模块所在目录,而不是命令行工具的当前工作目录
/*
test.js
*/
var first = 'hello nodejs';
console.log(first);
/*
relativeOrAbsolute.js
*/
const fs = require('fs');
fs.readFile('./test.js', 'utf8', (err, doc) => {
console.log(err)
console.log(doc)
});
当前命令行窗口工具工作目录与文件relativeOrAbsolute.js
目录不匹配,node.js运行结果:
使用__dirname
返回被读取文件的绝对路径,改进代码
/*
relativeOrAbsolute.js
*/
const fs = require('fs');
const path = require('path');
console.log(__dirname);//获取当前模块绝对路径
console.log(path.join(__dirname, 'test.js'))//获取目标文件绝对路径
fs.readFile(path.join(__dirname, 'test.js'), 'utf8', (err, doc) => {
console.log(err)
console.log(doc)
});
require('path')#
想要使用node.js系统模块中的 path系统模块
,首先需要在当前模块中引入 path
。
const path = require('path');
path.join()#
路径拼接问题:不同操作系统的路径分隔符不统一
- Windows系统 路径分隔符:
\ 或者 /
- Linux系统 路径分隔符:
/
- ...
实际场景:用户能在网站上上传头像,网站开发者需要指定头像文件上传到服务器的路径,而功能代码是运行在 Linus 系统上的,路径分隔符不好确定。
path.join()能解决路径分隔符的问题,只需要指定路径名,该方法能自动匹配系统生成相应的路径分隔符
功能:可以把多个路径片段拼接为完整的路径字符串并返回出来
格式:
path.join([...paths]);
参数说明:
- ...path<string>: 路径片段的序列
- 返回值:<string> 拼接好的路径字符
举例:
const path = require('path');
var pathStr1 = path.join('a', 'b','c');
console.log(pathStr1);
var pathStr2 = path.join('/a','/b/c', '../','./d', 'e');
console.log(pathStr2);
var pathStr3 = path.join(__dirname, './file/1.txt')
console.log(pathStr3);
运行结果
path.basename()#
path.basename(path[, ext])
功能:可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名。
格式:
path.basename(path[, ext]);
参数说明:
- path<string>: 必选,表示一个路径的字符串
- ext<string>: 可选,表示文件扩展名
- 返回:<string>, 表示路径中的最后一部分
举例:
const path = require('path');
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.extname(path)
参数说明:
- path<String>:必选,表示一个路径字符串
- 返回值:<string> 返回得到的扩展名字字符串
举例:
const path = require('path');
const fpath = '/a/b/c/index.html'; //路径字符串
const fext = path.extname(fpath);
console.log(fext); //输出 .html
系统模块 util
const fs = require('fs');
// 改造现有异步函数api 让其返回promise对象 从而支持异步函数语法
const promisify = require('util').promisify;
// 调用promisify方法改造现有异步API 让其返回promise对象
const readFile = promisify(fs.readFile);
async function run () {
//被改造的readfile异步API的结果(文件读取错误信息对象或文件读取结果)在Promise对象中
let r1 = await readFile('./1.txt', 'utf8')
let r2 = await readFile('./2.txt', 'utf8')
let r3 = await readFile('./3.txt', 'utf8')
console.log(r1)
console.log(r2)
console.log(r3)
}
run();
作者:Hong•Guo
出处:https://www.cnblogs.com/ghnb1/p/15855273.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix