2016-01-02 3 views
7

Ich habe eine server-app, die einen Audio-Stream vom Client erhält. Ich versuche, um die Anwendung zu testen, mit chai/chai-http, aber es gibt mir diese Fehlermeldung:Chai-http schreiben nach Ende

[Error: write after end]

Was ist das Problem?

Code:

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

Antwort

5

Sie req.end Aufruf, bevor der Strom-Daten beendet auf die Anfrage schieben.

Ich würde folgendes tun:

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

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

und für den Strom req.end im schließen oder Ende Ereignisse nennen. Sie rufen req.end auf, bevor eines dieser Ereignisse ausgegeben wird.

+0

das hat nicht geholfen, ich lege die 'req.end' in den' readstream.on ('end') 'Callback, es hält mich Fehler – bubakazouba

+0

nicht writableStream.end() am Ende oder zu schließen event of redableStream Wenn pipin los wird, benutzt du Optionen, um beschreibbar zu bleiben, weil in diesem Fall writableStream per Pipe beendet wird. – jlvaquero

+0

Ich habe endlich diesen Teil behoben, aber ich bekomme immer noch '[SyntaxError: Unexpected token {]' als Fehlermeldung in req.end, alles was auf der Client-Seite geschieht ist: 'response.json ({" hi ": "tschüss"}); ' – bubakazouba

3

Grundsätzlich JavaScript ist asynchron und Stream oder Socket-Verbindung ist synchronus, Wenn Sie einen Stream erstellt man für den Strom warten müssen schließen eine weitere Anforderung

In Ihrem Fall die req.end immer ausgeführt, sobald Sie geöffnet der Strom

drei Optionen zur Verfügung, um sie schließen im Strom Arbeit

  1. Versuchen mit chai Mittel
  2. Setzen sie Ihren Code zu sein, weil beide chai.end und s tream Ende scheint für Ihr Szenario
  3. put innen setTimeOut req.end gleich zu sein
2

Beim Anschließen von Leitungen in der Standardeinstellung (Hat kann für den ungünstigsten Fall nicht versucht sein), end() auf dem Ziel aufgerufen wird, wenn der Quellenstrom emittiert 'end' Ereignis. Sie müssen also nicht selbst end() anrufen.

Suscribe zum 'finish' und 'error' Ereignisse des Zielstrom zu steuern, wenn die Arbeit getan ist, oder wenn ein Fehler passiert:

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

Wenn Sie den Schreiber (req) offen halten möchten, können Sie einstellen, end option zu false wenn Rohrleitung:

fs.createReadStream('./test.wav').pipe(req, options = {end = false}); aber bedenken Sie, dass "Ende" Ereignis nicht durch die Leitung ausgelöst werden.

+0

Was ist der Unterschied zwischen 'finish' und' end'? – bubakazouba

+0

Beschreibbare Streams haben kein Endereignis. – jlvaquero

+0

'finish' wird nie aufgerufen, nur mein' end'. – bubakazouba