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

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

如何在 Node.js 中使用 Promise 操作基于回调的 fs.appendFile() 方法?

fs.appendFile()方法在 Node.js 的文件系统模块中定义。文件系统模块基本上是与用户计算机的硬盘进行交互的。 appendFile() 方法用于在现有文件中附加新数据,或者如果文件不存在,则首先创建文件,然后将给定的数据附加到文件中。

fs.appendFile() 方法基于回调。使用回调方法导致回调嵌套或回调地狱问题的可能性很大。因此,为了避免它,我们几乎喜欢使用基于 Promise 的方法。使用一些额外的 node.js 方法,我们可以以 Promise 的方式操作基于回调的方法。

句法:

fs.appendFile(path, data, options)

范围:

  • 路径:它是一个字符串、缓冲区或 URL,指定要在其中附加给定数据的目标文件的路径。
  • 数据:它是一个字符串或缓冲区,将附加到目标文件。
  • options:它是一个可选参数,它以某种方式影响输出,因此我们是否将其提供给函数调用。
    • encoding:指定编码技术,默认为'UTF8'。
    • mode:指定文件模式。文件模式允许我们创建、读取、写入或修改文件。默认值为“0o666”。
    • flag:它指定附加到文件时使用的标志。默认值为“a”。

方法:基于回调的 fs.appendFile() 方法。要使用 Promise 操作它,首先,我们使用实用程序模块中定义的 promisify() 方法将其转换为基于 Promise 的方法。

示例 1:

// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
  
// Convert callback based methods to
// promise based methods
const appendContent = util.promisify(fs.appendFile)
const readFileContent = util.promisify(fs.readFile)
   
  
// The readFileContent() method reads the
// file and returns buffer form of the data 
readFileContent('./testFile.txt')
.then(buff => {
  
    // File content before append 
    const oldContent = buff.toString()
    console.log(`\nBefore Append: ${oldContent}\n`)
   
    // Append operation
    return appendContent('./testFile.txt', 
            '\nHey, I am newly added..!!')
})
   
.then(() => {
  
    // Getting new file content
    return readFileContent('./testFile.txt')
})
     
.then(buff => {
  
    // File content after append 
    const newContent = buff.toString()
    console.log(`After Append: ${newContent}\n`)
})
     
.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 appendContent = util.promisify(fs.appendFile)
const readFileContent = util.promisify(fs.readFile)
   
const appendDataToFile = async (path, data) => {
   
  // The readFileContent() method reads the file
  // and returns buffer form of the data 
  const oldBuffer = await readFileContent(path)
   
  // File content before append 
  const oldContent = oldBuffer.toString()
   
  // Append operation
  await appendContent(path, data)
   
  const newBuffer = await readFileContent(path)
   
  // File content after append 
  const newContent = newBuffer.toString()
   
  console.log(`\nBefore Append: ${oldContent}\n`)
  console.log(`After Append: ${newContent}`)
}
   
appendDataToFile('./testFile.txt', 
    '\nHey, I am newly added..!!')
.catch(err => {
  console.log(`Error Occurs, 
    Error code -> ${err.code}, 
    Error NO -> ${err.errno}`)
})
})

输出:

示例 2:当文件名的给定路径不存在时。

// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
  
// Convert callback based methods to 
// promise based methods
const appendContent = util.promisify(fs.appendFile)
const readFileContent = util.promisify(fs.readFile)
  
// Append operation if given file does not exist
// it will be created first then data is appended
appendContent('./testFile.txt', 
    'Please add me to the test file..!!')
.then(() => {
  
    // readFileContent() method reads the file
    // and returns buffer form of the data 
    return readFileContent('./testFile.txt')
})
   
.then(buff => {
  
    // Appended data
    const content = buff.toString()
    console.log(`\nContent : ${content}`)
})
   
.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 appendContent = util.promisify(fs.appendFile)
const readFileContent = util.promisify(fs.readFile)
  
const appendDataToFile = async (path, data) => {
  
  // Append operation if given file does not exist
  // it will created first then data is appended
  await appendContent(path, data)
   
  // readFile() method reads the file
  // and returns buffer form of the data 
  const buff = await readFileContent(path)
   
  // File content after append 
  const content = buff.toString()
  console.log(`\nContent : ${content}`)
}
   
appendDataToFile('./testFile.txt', 
    'Please add me to the test file..!!')
  
.catch(err => {
  console.log(`Error Occurs, 
    Error code -> ${err.code}, 
    Error NO -> ${err.errno}`)
})

运行程序前的目录结构:

运行程序后的目录结构:

输出: