访问节点ReadStream

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

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(); }); 

本质上,stream是在创build的图像上进行的,并发送到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(); }); 

基本上我附加了两个事件监听器到现有的stream来访问数据,所以一些检查头文件。

让我感到困扰的是我在这里做得过分的感觉。 我想避免这两个监听器(数据和closures),并尽可能读取stream。

更确切地说,这部分代码接收stream,并在其内部我想访问数据,然后再发送到AWS。 这个stream是准备好的,简单地说,我怎么读,而不使用事件?

 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(); });