📌  相关文章
📜  如何在 Node.js 中使用 Promise 操作基于回调的 fs.readFile() 方法?

📅  最后修改于: 2022-05-13 01:56:25.280000             🧑  作者: Mango

如何在 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”错误。