一、Nodejs出现的意义
在Nodejs出现之前,用JavaScript我们无法对数据进行操作,js是基于浏览器进行开发的,要想开发服务器则要解决js中不能解决的两个问题,一是不能对文档流进行操作(文件的读取/写入),二是没有数据库的问题。
二、对文件数据的操作
nodejs开发服务器,要对文件数据的操作,即文件的读取和写入。
访问服务器的过程,就是文件读取和写入的过程。
对文件操作有很多种,同步操作、异步操作、简单操作……
在Nodejs中一般都为异步操作。
文件操作所有的操作方式都依赖于内置模块—fs模块,这个模块是专门操作文件的
基于模块来写模块的引入,fs模块用require方法来引入,赋值给const定义的常量fs
(const常量一经定义赋值不再轻易改变)。
//引入js核心模块--文件管理模块fs
const fs = require('fs');
注意⚠️:写入对象数据时,要调用对象的方法JSON.stringify() 将js数据转为JSON数据(字符串)再进行写入文件。(详例见 异步文件写入)
写入过程大致分为三步:
1.将文件打开。返回值是一个资源句柄,资源句柄指的是这句话占有内存的语句(文件对象);
2.将内容写入目标文件中;
3.关闭目标文件,目的是为了节约占用内存。
2.1 同步文件写入
涉及到三个方法:fs.openSync() fs.writeSync(). fs.closeSync()
fs.openSync(‘url+文件名’,打开方式,打开权限)
返回值:资源句柄(Resource handle),即写进的文件对象;
一参:‘url+文件名’,路径url一定不能错,如找不到该文件,则自动创建;
二参:打开方式,r 只读;w 写入,覆盖写;a 写入,追加写;
三参:打开权限,一般不传参。
let fh = fs.openSync('./file/sync.txt','w');
fs.writeSync(资源句柄,写入内容,字符集,写入起始位置)
一参:资源句柄;
二参:写入内容,可以是字符串、JSON数据……
三参:编码字符集,常用 万国码‘utf-8’
四参:默认从左到右第一位开始,一般不传值。
let str = '我是传入的数据';
fs.writeSync(fh,str,'utf-8');
fs.closeSync(资源句柄)
一参:资源句柄,即关闭写入数据的文件对象。
fs.closeSync(fh);
2.2 异步文件写入
相比于同步文件写入,异步文件写入少了返回值,但多了回调函数。即每一个方法后都有一个回调函数,函数内置一或多个参数,用于判断方法是否执行成功,或此方法执行成功后,后续代码的执行。
fs.open(‘url+文件名’,打开方式,(error,资源句柄)=>{})
一参:‘url+文件名’,如不存在改文件,则自动创建;
二参:打开方式,‘r’ 只读;‘w’,写入,覆盖写;‘a’,写入,追加写;
三参:回调函数,内置两参–错误信息,资源句柄data
//以js数据为例
let obj = {name:'lisa',age:18,sex:'女',};
fs.write(资源句柄,写入内容,字符集,error=>{})
一参:资源句柄data
二参:写入内容
JSON.stringify(obj);//转为JSON数据 再写入
三参:字符集,用‘utf-8’
四参:回调函数 包含对错误信息的判断
error=>{
if(error) console.log('写入失败');
else console.log('写入成功');
}
fs.close(资源句柄,error=>{})
一参:资源句柄data
二参:回调函数。内置一参,错误信息。
//完整代码
let obj = {name:'lisa',age:18,sex:'女'};
fs.open('./file/async.json','w',(error,fd)=>{
if(error){
console.log('路径不存在或没权限');
}else{
// 打开文件成功后 的写入
fs.write(fd,JSON.stringify(obj),'utf-8',error=>{
if(error) console.log('写入失败');
else console.log('写入成功');
});
// 关闭文件
fs.close(fd,error=>{
error?console.log('关闭失败'):console.log('关闭成功');
})
}
})
2.3简单文件写入(推荐使用 简单易记)
先引入js内置 文件管理模块
const fs = require('fs');
简单写入----异步写入
fs.writeFile(‘url’,写入内容,{字符集,写入方式},error=>{});
一参:‘url’,路径,包含路径和文件名,此例中为.json文件;
二参:写入内容。此例中为处理过后的JSON数据;
三参:描述,包含字符集,写入方式{encoding:‘utf-8’,flag:‘w’};
四参:回调函数,内置一参 错误信息
// 定义一个写入的内容 js数据,写入时转为JSON数据
let bookDate = [
{id : 1,name : "聊斋志异",price : 600,author : "蒲松龄"},
{id : 2,name : "西游记",price : 700,author : "吴承恩"},
{id : 3,name : "红楼梦",price : 800,author : "曹雪芹"},
{id : 4,name : "水浒传",price : 900,author : "施耐庵"},
{id : 5,name : "三国演义",price : 1000,author : "罗贯中"},
{id : 6,name : "资治通鉴",price : 1100,author : "司马光"}
];
//异步写入方式
fs.writeFile('./file/easy.json',JSON.stringify(bookDate),{encoding:'utf-8',flag:'w'},error=>{
//三目运算符 以js数据bookDate为例
error?console.log('写入失败'):console.log('写入成功');
});
//同步写入方式,以字符串str为例
let str = '我是被写入的内容';
fs.writeFileSync('./file/writeFileSync.txt',str,{encoding:'utf-8',flag:'w'});
2.4 文件的读取
先引入fs内置核心模块 文件管理模块fs
const fs = require('fs');
fs.readFile(url,字符集,(error,资源句柄)=>{})
// 文件的异步读取
一参:url,读取的地址;
二参:读取的字符集,可选参数,常用‘utf-8’,如果不传取出的是一个buffer(二进制集合);
三参:回调函数,内置两参,错误信息和资源句柄date
//以读取.json文件为例
//要注意的是,读取JSON数据要调用对象方法JSON.parse() 转为真正的js数据
fs.readFile('./file/easy.json','utf-8',(error,data)=>{
error?console.log('读取失败'):console.log(JSON.parse(date));
});
// 不传读取的字符集 得到的是一个buffer(即 二进制集合)
fs.readFile('./file/easy.json','utf-8',(error,data)=>{
error?console.log('读取失败'):console.log(JSON.parse(date));
});
//文件的同步读取,与异步读取相比少了回调函数,多了返回值
//同步读取.JSON文件
let data = fs.readFileSync('./file/easy.json','utf-8');
console.log(data);//得到一组真正的js数据
let date = fs.readFileSync('./file/easy.json');
console.log(date);//得到一组buffer,即二进制集合
(暂更新于2021.07.24 11:59 如有错误 还请斧正…)