通过异步/等待严重返回NodeJS流

时间:2018-07-10 07:38:02

标签: node.js stream async-await

我正在尝试检查文件夹中是否存在图像。 如果存在,我想将其流传输到res(我正在使用Express) 如果不存在,我想做另一件事。

我创建了一个异步函数,该函数应该返回图像的流(如果存在)或返回false(如果不存在)。

执行此操作时会得到一个流,但是浏览器上的负载是无限的,好像该流有问题。

这是我所能获得的最少复制品: Link to runnable code

const express = require('express');
const path = require('path');
const fs = require('fs');

const app = express();

app.get('/', async (req, res) => {
    // Check if the image is already converted by returning a stream or false
    const ext = 'jpg';
    const imageConvertedStream = await imageAlreadyConverted(
        './foo',
        1,
        '100x100',
        80,
        ext
    );

    // Image already converted, we send it back
    if (imageConvertedStream) {
        console.log('image exists');

        res.type(`image/${ext}`);

        imageConvertedStream.pipe(res);
        return;
    } else {
        console.log('Image not found');
    }
});

app.listen(3000, () => {
    console.log('Server started on port 3000');
});

async function imageAlreadyConverted(
    basePath,
    id,
    size,
    quality,
    extWanted
) {
    return new Promise(resolve => {
        // If we know the wanted extension, we check if it exists
        let imagePath;

        if (extWanted) {
            imagePath = path.join(
                basePath,
                size,
                `img_${id}_${quality}.${extWanted}`
            );
        } else {
            imagePath = path.join(basePath, size, `img_${id}_${quality}.jpg`);
        }

    console.log(imagePath);

        const readStream = fs.createReadStream(imagePath);

        readStream.on('error', () => {
      console.log('error');
            resolve(false);
        });

        readStream.on('readable', () => {
      console.log('readable');
            resolve(readStream);
        });
    });
}

我的图像中有95%可用,并且我需要性能,我想用fs.stats检查然后创建流比尝试创建流和处理错误要花费更长的时间。

1 个答案:

答案 0 :(得分:0)

问题出在“可读”事件上。一旦切换到“打开”事件,一切都很好。