如何在 Node.js 中使用 Promise 操作基于回调的 fs.readFile() 方法?
fs.readFile()方法在 Node.js 的文件系统模块中定义。文件系统模块基本上是与用户计算机的硬盘进行交互的。 readFile() 方法用于异步读取文件的全部内容并返回数据的缓冲区形式。
fs.readFile() 方法基于回调。使用回调方法导致回调嵌套或回调地狱问题的可能性很大。因此,为了避免这种情况,我们几乎总是喜欢使用基于 Promise 的方法。使用一些额外的 node.js 方法,我们可以以 promise 的方式操作基于回调的方法。
句法:
fs.readFile(path, options)
注意:不需要回调,因为我们使用 Promise 操作该方法。
参数:此方法接受上面提到的两个参数,如下所述:
- path:它是一个字符串、缓冲区或 URL,它指定我们尝试读取其内容的文件的路径。
- options:它是一个可选参数,它以某种方式影响输出,因此我们是否将其提供给函数调用。
- encoding:它是一个指定编码技术的字符串,默认为空。
- flag:它是一个指定文件系统标志的字符串。它的默认值为'r'。
方法:基于回调的 fs.readFile() 方法。要使用 Promise 操作它,首先,我们使用实用程序模块中定义的 promisify() 方法将其转换为基于 Promise 的方法。
示例 1:文件名:index.js
// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
// Convert callback based methods to
// promise based methods
const readFileContent = util.promisify(fs.readFile)
// The readFileContent() method reads the file
// and returns buffer form of the data
readFileContent('./testFile.txt')
// If promise resolved and datas are read
.then(buff => {
const contents = buff.toString()
console.log(`\nContents of the file :\n${contents}`)
})
// If promise get rejected
.catch(err => {
console.log(`Error occurs, Error code -> ${err.code},
Error No -> ${err.errno}`);
});
使用 async-await 实现相同的功能。
// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
// Convert callback based methods to
// promise based methods
const readFileContent = util.promisify(fs.readFile)
const fetchFile = async (path) => {
// The readFileContent() method reads the file
// and returns buffer form of the data
const buff = await readFileContent(path)
const contents = buff.toString()
console.log(`\nContents of the file :\n${contents}`)
}
fetchFile('./testFile.txt')
// If promise get rejected
.catch(err => {
console.log(`Error Occurs, Error code -> ${err.code},
Error NO -> ${err.errno}`);
});
使用以下命令运行 index.js 文件:
node index.js
输出:
示例 2:如果给定的文件路径不存在。
文件名:index.js
// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
// Convert callback based methods to
// promise based methods
const readFileContent = util.promisify(fs.readFile)
// The readFileContent() method reads the file
// and returns buffer form of the data
readFileContent('./false/path.txt')
// If promise resolved and datas are read
.then(buff => {
const contents = buff.toString()
console.log(`\nContents of the file :\n${contents}`)
})
// If promise get rejected
.catch(err => {
console.log(`\nError occurs, Error code -> ${err.code},
Error No -> ${err.errno}`);
})
使用 async-await 实现相同的功能。
// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
// Convert callback based methods to
// promise based methods
const readFileContent = util.promisify(fs.readFile)
const fetchFile = async (path) => {
// The readFileContent() method reads the file
// and returns buffer form of the data
const buff = await readFileContent(path)
const contents = buff.toString()
console.log(`\nContents of the file :\n${contents}`)
}
fetchFile('./false/path')
// If promise get rejected
.catch(err => {
console.log(`\nError Occurs, Error code -> ${err.code},
Error NO -> ${err.errno}`);
});
使用以下命令运行 index.js 文件:
node index.js
输出:
说明: fs.readFile() 方法读取文件的内容,因此它需要一个存在的文件路径。由于文件的给定路径不存在,因此出现错误代码“ENOENT”和错误号“-4058”。当指定的路径名不存在时,会发生“ENOENT”错误。
示例 3:当给定路径是文件夹而不是文件的路径时。
文件名:index.js
// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
// Convert callback based methods to
// promise based methods
const readFileContent = util.promisify(fs.readFile)
// The readFileContent() method reads the file
// and returns buffer form of the data
readFileContent('./testFolder')
// If promise resolved and datas are read
.then(buff => {
const contents = buff.toString()
console.log(`\nContents of the file :\n${contents}`)
})
// If promise get rejected
.catch(err => {
console.log(`\nError occurs, Error code -> ${err.code},
Error No -> ${err.errno}`);
});
使用 async-await 实现相同的功能。
// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
// Convert callback based methods to
// promise based methods
const readFileContent = util.promisify(fs.readFile)
const fetchFile = async (path) => {
// The readFileContent() method reads the file
// and returns buffer form of the data
const buff = await readFileContent(path)
const contents = buff.toString()
console.log(`\nContents of the file :\n${contents}`)
}
fetchFile('./testFolder')
// If promise get rejected
.catch(err => {
console.log(`\nError Occurs, Error code -> ${err.code},
Error NO -> ${err.errno}`);
});
使用以下命令运行 index.js 文件:
node index.js
输出:
说明: fs.readFile() 方法读取文件的内容,因此它是预期的文件路径。由于给定路径是文件夹的路径,因此会出现错误代码“EISDIR”和错误编号“-4068”。当操作需要一个文件,但给出了目录的路径名时,会发生“EISDIR”错误。