2016-01-02 19 views
7

İstemciden bir ses akışı alan bir server-app sahibim. Ben chai/chai-http kullanarak uygulamayı test etmek çalışıyorum, ama bana bu hata veriyor:chai-http yazdıktan sonra

[Error: write after end]

sorunu ne?

Kodu: dere isteğine veri bastırıyor bitirir önce req.end aradığınız

var chai = require('chai'); 
var chaiHttp = require('chai-http'); 
var server = require('../server-app'); 
var should = chai.should(); 
var fs = require('fs'); 

chai.use(chaiHttp); 


describe('server', function() { 
    it('should work..', function (done){ 
    var req = chai.request(server).post('/speech'); 
    fs.createReadStream('./test.wav').pipe(req); 
    req.end(function (err,res){ 
     console.log(err);//outputs: [Error: write after end] 
     done(); 
    }); 
    }); 
}); 

cevap

5

.

var readstream = fs.createReadStream('./test.wav'); 
readstream.pipe(req); 

readstream.on('close', someFunction); 
readstream.on('end', someFunction); 

ve yakın veya sonunda akışı için olayları req.end çağırır:

aşağıdaki yapardı. Bu etkinliklerden herhangi birinin yayınlanmasından önce req.end çağırıyorsunuz.

+0

bu yardımcı olmadı, 'req.end 'öğesini readstream.on (' end ')' geri arama içine koydum, bana hata veriyor – bubakazouba

+0

Endişeyi writableStream.end() yöntemiyle sona erdirme veya kapatma redable olayı Pipin unles'in yazılabilir açık tutmak için seçenekleri kullandığınızda, bu olayda writableStream, boru ile sonlandırılır. – jlvaquero

+0

Sonunda bu bölümü düzelttim, ancak hala [SyntaxError: Unexpected token {] 'ı req.end'de hata mesajı olarak alıyorum, hepsi istemci tarafında yapıyor:' response.json ({"hi": "bye"}); – bubakazouba

3

Temelde JavaScript Asynchronus ve akışıdır veya soket bağlantısı bir dere oluşturdu sonra başka bir isteği Senin durumunda

req.end yapmak kapatmak için akışı için beklemek zorunda Açtığınız kez idam alma, synchronus olduğunu

Üç seçenek mevcut akışı o

  • yakın akışında kodunuzu koyun

    1. chai maddesiyle deneyin çalışması olarak yapmak için çünkü chai.end ve s hem Team, son setTimeout içine req.end
    2. koymak boru, varsayılan olarak, end() hedefe denir
  • 2

    , kaynak akımı (en kötü durum için olabilir denemedim mi) senaryonuz için aynı gibi görünüyor 'end' olayını yayar. Yani, kendi başına end()'u aramak zorunda değilsiniz.

    zaman yapılır eser veya bir hata olur denetlemek için hedef akışının 'finish' ve 'error' olaya Suscribe:

    fs.createReadStream('./test.wav').pipe(req); 
    req.on('error', (err) => {console.log(err);}); 
    req.on('finish',() => {done();}); 
    

    Eğer yazar (req) tutmak istiyorsanız ayarlayabileceğiniz açmak end option, boru döşemesinde yanlış olduğunda:

    fs.createReadStream('./test.wav').pipe(req, options = {end = false}); ancak 'son' olayının boru tarafından ateşlenmeyeceğini unutmayın.

    +0

    "finiş" ve "son" arasındaki fark nedir? – bubakazouba

    +0

    Yazılabilir akışların sonu etkinliği yoktur. – jlvaquero

    +0

    'finish' asla çağrılmaz, sadece benim' end' yapar. – bubakazouba

    İlgili konular