如何使用Node.js createReadStream和createWriteStream编写多个文件

好的,这里是这个代码的总体目标。 我正在使用TinyPNG的API来压缩png文件的文件夹。 我有一个名为filename.png的文件的input文件夹。 此代码将文件名的目录读取到数组文件中,然后为要发送到API的文件创build读取和写入stream,进行处理,然后返回,以便将其写入输出文件夹中的文件。 我知道这个代码对于一个文件是有效的,但是不止如此,抛出了一个写完之后的exception,因为pipe道在第一个文件后自动closures。 我试图设置input和输出作为数组,只是引发另一个exception。

任何提示如何设置多个读取和写入stream将是真棒和非常有用的每个人:)。

当前代码:

var fs = require('fs'); var inputFolder = "input/"; var outputFolder = "output/"; var https = require("https"); var key = "GETYOUROWNFREEONEFROMTINYPNG.ORG"; process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; var options = require("url").parse("https://api.tinypng.com/shrink"); options.auth = "api:" + key; options.method = "POST"; console.log("Reading files..."); fs.readdir("./input", function (err, files) { if (err) throw err; console.log(files.length + " files read..."); var input; var output; var request; for(var i = 0; i < files.length; i++) { input = fs.createReadStream(inputFolder + files[i]); output = fs.createWriteStream(outputFolder + files[i]); request = new https.request(options, function(response) { if (response.statusCode === 201) { /* Compression was successful, retrieve output from Location header. */ https.get(response.headers.location, function(response) { response.pipe(output); }); } else { /* Something went wrong! You can parse the JSON body for details. */ console.log("Compression failed"); } }); input.pipe(request); } }); 

这里是其他人使用的固定文件感谢@Wyatt提供的答案:

 var fs = require('fs'); var inputFolder = "input/"; var outputFolder = "output/"; var https = require("https"); var key = "WotZ46HnxPl_HwpT3uZjtY_0f8fMEiSR"; process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; var options = require("url").parse("https://api.tinypng.com/shrink"); options.auth = "api:" + key; options.method = "POST"; console.log("Reading files..."); fs.readdir("./input", function (err, files) { if (err) throw err; console.log(files.length + " files read..."); var input, request; for(var i = 0; i < files.length; i++){ input = fs.createReadStream(inputFolder + files[i]); request = closureRequest(fs.createWriteStream(outputFolder + files[i])); input.pipe(request); } }); function closureRequest(output){ return new https.request(options, function(response) { if (response.statusCode === 201) { /* Compression was successful, retrieve output from Location header. */ https.get(response.headers.location, function(response) { response.pipe(output); }); } else { /* Something went wrong! You can parse the JSON body for details. */ console.log("Compression failed"); } }); } 

您在循环中重复分配输出variables,而请求callback正在尝试引用它。 你可以捕捉每个值在闭包来解决这个问题。

 ... function closureRequest(output){ return new https.request(options, function(response) { if (response.statusCode === 201) { /* Compression was successful, retrieve output from Location header. */ https.get(response.headers.location, function(response) { response.pipe(output); }); } else { /* Something went wrong! You can parse the JSON body for details. */ console.log("Compression failed"); } }); } var input , request ; for(var i = 0; i < files.length; i++){ input = fs.createReadStream(inputFolder + files[i]); request = closureRequest(fs.createWriteStream(outputFolder + files[i])); input.pipe(request); }