1

我有一段包含在承诺中的代码。那段代码从 http 中读取图像,做各种事情,最后将其发送到 aws.s3.putObject。它看起来像这样(简化): 请注意表单是多方对象。

form.on('part', (part) => {//form is multiparty
    fileCount++;
    let tmpFile = path.join(os.tmpDir(), `${userId}_${timePrefix}_${path.basename(part.filename)}`);
    part.pipe(fs.createWriteStream(tmpFile));
    part.on('end', () => {
        resolve(fs.createReadStream(tmpFile));
    });
    part.once('error', (error) => {
        handleError(error);
    });
});

form.once('error', (error) => {
    handleError(error);
});

form.parse(request);
}).then((imageStream) => {
   //here is a call to AWS S3.putObject. Which return a promise
}).then(() => {
    return new Ok();
});

本质上,流是在创建的图像上制作并发送到 AWS。我想在二进制级别进行一些操作(读取文件签名,检查它是否是图像)。我让它像这样工作:

form.on('part', (part) => {
    fileCount++;

    let tmpFile = path.join(os.tmpDir(), `${userId}_${timePrefix}_${path.basename(part.filename)}`);
    part.pipe(fs.createWriteStream(tmpFile));
    part.on('end', () => {
        let chunk = [];
        let file = fs.createReadStream(tmpFile);
        let isFirstChunkSet = false;
        file.on('data', function(chunks) {
            if (!isFirstChunkSet){
                chunk = chunks;
                isFirstChunkSet = true;
            }
        });

        file.on('close', function() {
            let magicNumber = chunk.toString('hex', 0, 2);           

            if (imageProperties.allowed_file_types.includes(magicNumber)) {
                resolve(fs.createReadStream(tmpFile));
            } else {
                error.message = 'wrong file type';
                handleError(error);
            }
        });
    });
    part.once('error', (error) => {
        handleError(error);
    });
});

form.once('error', (error) => {
    handleError(error);
});

form.parse(request);
}).then((imageStream) => {
    //here is a call to AWS S3.putObject. Which return a promise
}).then(() => {
    return new Ok();
});

基本上,我将两个事件侦听器附加到现有流以访问数据,因此对头文件进行了一些检查。

困扰我的是我在这里做的事情太多的感觉。我想避免这两个侦听器(数据和关闭)并尽可能读取流。

更准确地说,这部分代码接收流,在其中我想在将数据发送到 AWS 之前访问数据。这个流已经准备好了,简单地说我如何在不使用事件的情况下读取它?

form.parse(request);
}).then((imageStream) => {
    //How can I access the imageStream here, without event listeners.
    //Assumption is the stream is ready to be accessed.

    //here is a call to AWS S3.putObject. Which return a promise
}).then(() => {
    return new Ok();
});
4

0 回答 0