如何利用扩展运算符简洁合并参数并正确写入Node.js流?
我尝试将多个参数合并为一条易读的文本行并写入文件,但未能实现。现有代码如下:
const fs = require('fs'); var stream = fs.createWriteStream('test.txt'); let log = function(...data) { console.log(...data); // 输出:one 2 three(预期效果) stream.write(...data); // 仅输出:one stream.write('\n'); }; stream.once('open', function() { log('one', 2, 'three'); stream.close(); });请问无需编写冗长函数,如何在stream.write中简洁捕获data的所有内容?
这个问题其实很好理解——console.log和stream.write处理参数的逻辑根本不一样!console.log会自动把传入的多个参数用空格分隔拼接成完整字符串输出,但stream.write只认第一个参数作为要写入的内容(必须是字符串或Buffer),后面的参数都会被当成回调函数处理,所以你用...data展开参数的时候,只有第一个值'one'被写入了,剩下的都被忽略了。
给你几个简洁又实用的解决办法:
用Node.js内置的
util.format(最推荐):console.log底层就是用这个方法来处理多参数拼接的,直接拿来用就能和控制台输出效果完全一致,连对象、特殊类型的格式化都帮你搞定了。代码改起来超简单:const fs = require('fs'); const util = require('util'); // 引入内置的util模块,不用额外安装 var stream = fs.createWriteStream('test.txt'); let log = function(...data) { console.log(...data); stream.write(util.format(...data) + '\n'); // 用util.format把所有参数拼成字符串 }; stream.once('open', function() { log('one', 2, 'three'); stream.close(); });手动用空格拼接(适合简单场景):
如果你的参数都是字符串或可以直接转成字符串的简单类型,直接用join(' ')就能快速拼接,代码更短:let log = function(...data) { console.log(...data); stream.write(data.join(' ') + '\n'); };不过要注意,这个方法碰到对象这类复杂类型时,会直接输出
[object Object],不如util.format智能。直接重定向console输出(完全复刻控制台效果):
如果你想让文件里的内容和控制台输出一模一样,甚至可以临时把console的输出流改成你的文件流,这样连console.log都不用改:const fs = require('fs'); var stream = fs.createWriteStream('test.txt'); const originalConsoleOut = console._stdout; // 先保存原来的控制台输出 console._stdout = stream; // 把console输出定向到文件 let log = function(...data) { console.log(...data); // 现在console.log会直接写入文件 }; stream.once('open', function() { log('one', 2, 'three'); console._stdout = originalConsoleOut; // 用完记得恢复原输出 stream.close(); });
一般来说第一种方法最省心,既简洁又能保证输出效果和控制台一致,完全不用自己写冗长的拼接逻辑~
内容的提问来源于stack exchange,提问作者user4893295

