如何使用 node.js 和 Promises 将特定行的行添加到文件的内容
Posted
技术标签:
【中文标题】如何使用 node.js 和 Promises 将特定行的行添加到文件的内容【英文标题】:How to add a line at a specific line row to a file's content using node.js and Promises 【发布时间】:2019-01-27 11:11:18 【问题描述】:情况:我编写了一些代码,循环遍历主目录及其子目录以查找 htm 文件,一旦找到 .htm 文件,它应该在 head 标签后添加一行,然后它应该循环进一步查找所有主目录中的其他 .htm 文件并执行相同的操作。
代码:
var fs = require("fs");
var path = require("path");
var mainDirectory = 'directory';
function addLineInFile() //execute the steps needed to alter the file's content in sequential order.
readContent() //can be found below.
.then(lookForHead) //can be found below.
.then(writeNewContent) //can be found below.
addLineInFile();
function readContent()
return new Promise((resolve, reject) =>
FileContent = [];
fs.readFile(extendedDirectoryPath, (err, data) =>
fileContent = data.toString('utf8').split("\n");
console.log("Read file content")
);
if (err)
reject(err);
else
resolve(FileContent);
);
function lookForHead(FileContent)
return new Promise((resolve, reject) =>
var string = "<head>"
for (i = 0; i < FileContent.length; i++)
console.log("Looking for <head>.")
if (FileContent[i].indexOf(string) !== -1)
console.log("found <head>")
FileContent.splice(i + 1, 0, 'line to be added')
if (err)
reject(err);
else
resolve(FileContent);
);
function writeNewContent(FileContent)
return new Promise((resolve, reject) =>
console.log("Started Writing to the file!")
var file = fs.createWriteStream(extendedDirectoryPath);
file.on('error', function(err) /* error handling */ );
FileContent.forEach(function(v)
file.write(v.join(', ') + '\n');
console.log("Wrote a line to the file.")
);
file.end();
if (err)
reject(err);
else
resolve(FileContent);
);
问题:文件被写入之前,必须写入的内容已准备好(查看输出)。因此 writeNewContent() 在 readContent() 和 lookForHead() 完成之前执行,将其内容写入文件中。在此之前我已经尝试了很多不同的东西,比如回调函数,并且确信 Promises 将是我的解决方案,但也许我使用不正确?请记住,我对 node.js 和 Promises 了解不多,我的大部分工作只是从互联网上复制粘贴并根据自己的喜好更改其中的一小部分。
输出:
Got file info successfully!
file1.htm This is an htm file!
Started Writing to the file!
Got file info successfully!
file2.htm This is an htm file!
Started Writing to the file!
Got file info successfully!
file3.htm This is an htm file!
Started Writing to the file!
Got file info successfully!
file4.htm This is an htm file!
Started Writing to the file!
Got file info successfully!
someInnerDirectory is a innerDirectory
Delving deeper!
Got file info successfully!
file5.htm This is anhtm file!
Started Writing to the file!
Got file info successfully!
file6.htm This is an htm file!
Started Writing to the file!
Got file info successfully!
file7.htm This is an htm file!
Started Writing to the file!
Read file content
Read file content
Read file content
Read file content
Read file content
Read file content
Read file content
【问题讨论】:
修复这种疯狂缩进的第一步是不要在一个非常大的代码块中完成所有事情,而是创建做一点点的小函数。这将非常有帮助,也会让其他人更愿意尝试解决您的问题。 感谢@Evert 的反馈,我将编辑我的问题。readline
包对于逐行流式传输文件很有用(而不是将整个文件读入内存)。但这不是您感兴趣的,无论如何您都想将所有行收集到一个数组中。所以使用fs.readFile
然后split("\n")
到一个数组,然后解决你的承诺。 Promise 也不适用于流式传输多个值。
谢谢@Bergi,这是否意味着我写入文件的方式也必须改变?
@Refflected 从想法上看,这看起来很不错,尽管有很多小错误。 (fileContent
vs FileContent
,它不应该是全局变量,而是通过参数传递,lookForHead
根本不需要承诺但可以同步return
其结果,i
是隐式全局的,@ 987654331@ 应该在流完成时解决它的承诺)
【参考方案1】:
到目前为止,您的工作做得很好并坚持下去。很高兴看到您也在使用递归。您正在创建一个名为 addLineInFile 的函数,但没有执行它。 I did something similar a while back, check it out
【讨论】:
不幸的是,我的步骤并没有按顺序进行,尽管您可能有解决这个问题的想法吗?如果您想了解更多信息,我编辑了我的问题。以上是关于如何使用 node.js 和 Promises 将特定行的行添加到文件的内容的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node.Js 和 Promises,你如何返回一个已经实现的 Promise? [复制]
如何在Node.js中对使用promises和事件发射器的函数进行单元测试?
使用 Javascript(以及 Node.js)使用 async/await 和 Promises 的正确方法是啥 [重复]
Node.js:何时使用 Promises 与 Callbacks