Node.js文件系统模块(fs模块)
入门教程链接
fs 模块提供了许多非常实用的函数来访问文件系统并与文件系统进行交互。
无需安装。 作为 Node.js 核心的组成部分,可以通过简单地引用来使用它:
const fs = require('fs');
关于 fs 模块的特殊之处是,所有的方法默认情况下都是异步的,但是通过在前面加上 Sync 也可以同步地工作。
例如:
- fs.rename()
- fs.renameSync()
- fs.write()
- fs.writeSync()
- fs.existsSync() 用于判断一个文件是否存在
这在应用程序流程中会产生巨大的差异。
举例使用:
fs.readFile('a.txt', 'utf8', function(err, data){
console.log(err);
console.log(data);
})
let exists = fs.existsSync('./note1.md') ;// 这个方法的异步方法被废弃了 (异步的回调中 存在不存在,node中要求 error-first)
在Node10版本以后,将文件读取操作都可以使用promise进行异步:
const fs = require('fs').promises;
fs.readFile('a.txt', 'utf8').then((data)=>{data},(err)=>{err});
模拟将fs模块改写为支持promise
我们可以先模拟将fs.readFile这个方法改写为支持promise的方法
根据node中的用法,我们得知,原来的readFile方法需要传入两个参数和一个回调函数,读取内容的操作在回调函数中做,支持promise后,它只接受两个参数,然后使用then方法读取内容。那我们写一个函数将readFile方法当作参数传进去,返回一个支持promise的方法出来。
那么就按照这个思路来写代码:
const fs = require('fs');
function promisify(fn) {
return function (...args) {
return new Promise((resolve, reject) => {
fn(...args, function (err, data) {
if (err) reject(err);
resolve(data);
})
});
}
}
const read = promisify(fs.readFile);
read('a.txt', 'utf8').then((data)=>{
console.log(data)
})
但是这样做,每一个方法都要进行一次转换,我们能否使用一个方法统一进行转换?
const fs = require('fs');
function promisify(fn) {
return function (...args) {
return new Promise((resolve, reject) => {
fn(...args, function (err, data) {
if (err) reject(err);
resolve(data);
})
});
}
}
function promisifyAll(obj) {
// 将所有的函数都转化成promise
for(let key in obj) {
let val = obj[key];
if(typeof val === "function") {
obj[key] = promisify(val);
}
}
}
promisifyAll(fs);
只要使用这个promisifyAll就可以进行全部转换啦!