Javascript 在NodeJS中,如何在不手动添加新行字符的情况下将行打印到文件中?

Javascript 在NodeJS中,如何在不手动添加新行字符的情况下将行打印到文件中?,javascript,node.js,nodejs-stream,Javascript,Node.js,Nodejs Stream,我试图弄清楚如何简单地将表示一行的字符串写入文件,在文件中,我调用的任何函数都会自动附加一个换行符 我已经尝试使用默认的NodeJS文件系统库进行此操作,但是如果不手动将'\n'附加到字符串中,我将无法以任何方式使其正常工作 以下是我尝试的代码: const fs = require('fs'); const writer = fs.createWriteStream('test.out.txt', { flags: 'w' }) writer.write('line 1') writer.w

我试图弄清楚如何简单地将表示一行的字符串写入文件,在文件中,我调用的任何函数都会自动附加一个换行符

我已经尝试使用默认的NodeJS文件系统库进行此操作,但是如果不手动将
'\n'
附加到字符串中,我将无法以任何方式使其正常工作

以下是我尝试的代码:

const fs = require('fs');
const writer = fs.createWriteStream('test.out.txt', { flags: 'w' })

writer.write('line 1')
writer.write('line 2');
writer.write('line 3');
writer.end('end');
但是,输出文件
test.out.txt
包含以下不带换行符的行:

line 1line 2line 3end
我希望它看起来像这样:

line 1
line 2
line 3
end
请注意,我没有尝试记录消息,也没有尝试重定向标准输出


有没有办法用自动添加的新行字符以这种方式打印?

手动添加
\n
也不错

您可以编写包装器函数,以避免将
+'\n'
放在任何地方:

const os = require('os');

let writeln = function (writeStream, str) {
    writeStream.write(str + os.EOL);
}

writeln(writer, 'line 1');
writeln(writer, 'line 2');
writeln(writer, 'line 3');
writeln(writer, 'end');

通过粗略查看
fs.WriteStream
文档可以看出,没有原生的
writeln
函数或任何类似的功能。

手动附加
\n
并没有那么糟糕

您可以编写包装器函数,以避免将
+'\n'
放在任何地方:

const os = require('os');

let writeln = function (writeStream, str) {
    writeStream.write(str + os.EOL);
}

writeln(writer, 'line 1');
writeln(writer, 'line 2');
writeln(writer, 'line 3');
writeln(writer, 'end');

通过粗略查看
fs.WriteStream
文档,我可以看出,没有本机的
writeln
函数或任何类似的函数。

如注释中所述,您可以编写一个函数,将文本添加为行

const writeLine = (writerObject, text) => {
  writerObject.write(`${text}\n`)
}
writeLine(writer, 'line 1')
writeLine(writer, 'line 2')
writeLine(writer, 'line 3')
或者,您也可以使用clojure创建一个包装器对象来保存“writer”,而不是每次都传递它

const customWriter = writerObject => {
  return text => writerObject.write(`${text}\n`)
}

const yourWriterWithBreakLine = customWriter(writer)
yourWriterWithBreakLine('line 1')
yourWriterWithBreakLine('line 2')
yourWriterWithBreakLine('line 3')

如注释中所述,您可以编写一个函数,将文本添加为行

const writeLine = (writerObject, text) => {
  writerObject.write(`${text}\n`)
}
writeLine(writer, 'line 1')
writeLine(writer, 'line 2')
writeLine(writer, 'line 3')
或者,您也可以使用clojure创建一个包装器对象来保存“writer”,而不是每次都传递它

const customWriter = writerObject => {
  return text => writerObject.write(`${text}\n`)
}

const yourWriterWithBreakLine = customWriter(writer)
yourWriterWithBreakLine('line 1')
yourWriterWithBreakLine('line 2')
yourWriterWithBreakLine('line 3')


你可以做一个附加的函数。我希望有一个内置的方法来实现这一点。C有
sprintf()
,Java有
println()
。当然,Javascript中有一种方法可以做到这一点。可能是()的重复。它不是该方法的重复,因为该方法是指将字符串附加到文件中。我实际上不想附加数据,尽管这对我来说并不重要。你担心跨平台EoL问题吗?看,你可以做一个附加函数。我希望有一个内置的方法可以做到这一点。C有
sprintf()
,Java有
println()
。当然,Javascript中有一种方法可以做到这一点。可能是()的重复。它不是该方法的重复,因为该方法是指将字符串附加到文件中。我实际上不想附加数据,尽管这对我来说并不重要。你担心跨平台EoL问题吗?请参阅,但最好使用
os.EOL
而不是硬编码“\n”,因此我还应该补充一点,我的目标是使用NodeJS生成多个命令行程序,因此,如果我自己添加代码来实现这一点,我必须创建一个它们都可以共享的库。已经有图书馆了吗?谢谢@RidgeA,编辑。很可能有一个图书馆会为你添加这几行,但它也可以做你不想做的事情,你可能不得不与它斗争,以缩小到你的特定目的。在这种情况下,创建一个由您维护的共享实用程序可能是有意义的,并且它完全满足您的需要。但是最好使用
os.EOL
,而不是硬编码的'\n',因此我还应该补充一点,我的目标是使用NodeJS生成多个命令行程序,因此如果我自己添加代码来实现这一点,我必须建立一个他们都能共享的图书馆。已经有图书馆了吗?谢谢@RidgeA,编辑。很可能有一个图书馆会为你添加这几行,但它也可以做你不想做的事情,你可能不得不与它斗争,以缩小到你的特定目的。在这种情况下,创建一个由您维护的共享实用程序可能是有意义的,并且它正是您所需要的。如果要使用闭包,可以传递两个参数:writer和EOL字符('\n'或'\r\n'或os.EOL,如果您使用的是“os”模块)。接受此答案是因为我喜欢闭包思想。如果要使用闭包,可以传递两个参数:writer和EOL字符(“\n”或“\r\n”或os.EOL,如果使用“os”模块)。接受此答案是因为我喜欢闭包思想。