Nodejs

2012-11-05 19 views
30

'da bir Tamponun ReadableStream'e Dönüştürülmesi Buffers ve ReadableStreams için oldukça yeniyim, bu yüzden bu aptalca bir sorudur. ReadableStream girişi olarak alan bir kitaplığım var, ancak girdim yalnızca bir base64 biçimindeki bir resim. Ben şöyle bir Tampon içinde ben verileri dönüştürmek olabilir:Nodejs

var img = new Buffer(img_string, 'base64'); 

Ama ReadableStream dönüştürmek veya bir ReadableStream elde edilen Tampon dönüştürmek için nasıl hiçbir fikrim yok.

Bunu yapmanın bir yolu var mı yoksa imkansızı başarmaya mı çalışıyorum?

Teşekkürler.

cevap

20

Öyle gibi Node Stream Buffers kullanarak bir ReadableStream oluşturabilirsiniz:

// Initialize stream 
var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({ 
    frequency: 10,  // in milliseconds. 
    chunkSize: 2048  // in bytes. 
}); 

// With a buffer 
myReadableStreamBuffer.put(aBuffer); 

// Or with a string 
myReadableStreamBuffer.put("A String", "utf8"); 

frekans 0 nedenle bu belli bir gecikme tanıtacak olamaz.

+0

Teşekkürler, biraz geç olsa bile. Sorunu nasıl çözdüğümü hatırlamıyorum ama bu güzel bir çözüm. Herkes bunu onaylarsa harika olur. Bu dönüşüm hakkında ZERO bulmayı hatırlıyorum. – Masiar

+0

Çalıştığının doğrulanması - filebacker'ların akışlara nasıl dönüştürüleceğine bakarken bunu buldu. –

+0

Dosyalarla uğraştığınız dosyalar varsa, bununla birlikte bir dosya okuma akışını şu şekilde açmanız gerekir: http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options – vanthome

32

Node Stream Buffer açıkça testlerde kullanılmak üzere tasarlanmıştır; bir gecikmeyi önleyememe, üretim kullanımı için zayıf bir seçim yapar. okunabilir streamin _read işlevi adım adım push bunu altta yatan bir kaynaktan veri toplamak ve gerektiği, genel esnasında

import { Readable } from 'stream' 

const buffer = new Buffer(img_string, 'base64') 
const readable = new Readable() 
readable._read =() => {} // _read is required but you can noop it 
readable.push(buffer) 
readable.push(null) 

readable.pipe(consumer) // consume the stream 

... böyle How to wrap a buffer as a stream2 Readable stream?

+0

Sadece yorum yapmak istiyorum, bu en iyi çözümdür, bazı durumlarda yüklemelerimi neredeyse 10 kat artırdı. Teşekkürler!! – Abadaba

+0

Bu çözümü, yanıt olarak kabul edilenlerden daha fazla düşünün. –

6

şey:

Gabriel Llamas bu yanıtında streamifier anlaşılacağı Gerekli olmadan önce büyük bir kaynağı belleğe almamanızı sağlar.

Bu durumda, zaten belleğe sahip olduğunuz halde, _read gerekli değildir.

Tüm arabellek yalnızca okunabilir akış api'sine kaydırılıyor.

0

streamifier modülünü kullanarak basit bir çözümdür.

const streamifier = require('streamifier'); streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);

Bunu argümanlar olarak Strings, Tampon ve Nesne kullanabilirsiniz.