2017-10-13 3 views
0

Ich benutze JsZip und exceljs Pakete. ExcelJs können Excel-Dokumente in den node.js-Stream schreiben, jszip kann Dateien aus dem Stream lesen und zum Archiv hinzufügen. Wie kann ich einen Stream-Transfer zwischen ihm vornehmen, um bequem damit arbeiten zu können? Ich mache diese Lösung, aber ich denke, seine schlechte Krücke ...Wie Transfer-Stream in node.js machen?

const stream2 = new Writable(); 
    stream2.result = []; 
    stream2._write = function (chunk, enc, next) { 
    this.result.push(chunk); 
    next(); 
}; 

    const stream1 = new Readable(); 
    stream1._read = function() { 
    stream1.push(stream2.result.shift() || null); 
    }; 

    let promise = new Promise((resolve, reject) => { 
    excelDoc.write(stream2).then(() => { 
     zip.file('excelDoc.xlsx', stream1); 
     resolve(true); 
    }); 
    }); 

Antwort

0

ich nicht ganz das, was Sie zu tun versuchen, aber es scheint, als ob Sie eine Duplex Stream oder Transform Stream sind neu zu erfinden. Dies sind Streams, die sowohl lesbar als auch schreibbar sind.

Transströme sind Duplex-Streams, wo die Ausgabe in irgendeiner Weise mit dem Eingang verbunden ist, und wir können sie nutzen, was Sie versuchen zu tun, (glaube ich):

const stream = require('stream'); 

const transformStream = new stream.Transform({ 
    transform: (data, encoding, callback) => callback(null, data) 
}); 

let promise = new Promise((resolve, reject) => { 
    excelDoc.write(transformStream).then(() => { 
    zip.file('excelDoc.xlsx', transformStream); 
    resolve(true); 
    }); 
}); 

Randbemerkung : normalerweise würden Sie etwas tun wie:

inputStream.pipe(excelDoc).pipe(zipStream).pipe(outputStream); 

Aber ich sehe, dass keine Ihrer Abhängigkeiten solche Syntax unterstützen.