使用Node.js将多个图像写入磁盘

时间:2019-02-22 18:26:40

标签: javascript node.js asynchronous promise axios

代码说明:

在第一个 .then()中,我获取了10张图像的数据。 然后使用 for of 循环,遍历每个单独的图像。在下一行中,我正在生成另一条路径来将图像保存到$ {count}。

现在是主要部分

我正在使用 axios 通过传递 image.url 来获取图像。在 .then()中,我得到了响应,并将其传递到预先生成的路径。

解决是否获取数据并增加计数以在下一次迭代中更改路径。拒绝出现任何错误

我正在执行 console.log(count ++),以检查是否要遍历所有10张图像,并得到“ 1 2 .... 10”输出,这意味着一切都在工作正常。


问题:根据代码,应将10张图像保存在 images 文件夹中,其名称为'image1,image2 ... image10' 。但是我只得到第一张图片。我究竟做错了什么?是否应该在for循环中将内容写入磁盘?

client.search('Steve Angello')
.then(images => {
    let count = 1;

    for(image of images){
        const path1 = path.resolve(__dirname, 'images', `image ${count}.jpg`);
        axios({
            method: 'GET',
            url: image.url,
            responseType: 'stream'
        })
        .then((response) => {
                response.data.pipe(fs.createWriteStream(path1));

                return new Promise( (resolve, reject) => {
                    response.data.on('end', () => {
                        resolve();
                        console.log(count++);
                    })

                    response.data.on('error', (error) => {
                        reject(error);
                    })
                })
            })
        .catch((err) => console.log(err));   
    }

});

Snapshot of the output

1 个答案:

答案 0 :(得分:3)

所有图像都被保存到名为“ image 1.jpg”的文件中(10次)。您可以通过在调用axios之前添加console.log来确认这一点。

我认为最简单的解决方案是更改您的循环

for(image of images){
    const path1 = path.resolve(__dirname, 'images', `image ${count}.jpg`);

for (count = 0; count < images.length; count++) {
    image = images[i];
    const path1 = path.resolve(__dirname, 'images', `image ${count+1}.jpg`);
    // and any other references to count should be removed