如何在 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}`)
})
运行程序前的目录结构:
运行程序后的目录结构:
输出: