2016-01-02 10 views
7

Ho un server-app che riceve un flusso audio dal client. Sto cercando di testare l'applicazione utilizzando chai/chai-http, ma mi dà questo errore:chai-http write after end

[Error: write after end]

Qual è il problema?

Codice:

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

risposta

5

si sta chiamando req.end prima che il flusso termina trasmettere i dati alla richiesta.

vorrei fare quanto segue:

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

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

e chiamare req.end alla fine vicino o eventi per il flusso. Stai chiamando req.end prima che uno di questi eventi venga emesso.

+0

che non ha aiutato, ho messo il 'req.end' all'interno del' readstream.on ('end') 'callback, continua a darmi errori – bubakazouba

+0

Non chiamare writableStream.end() alla fine o vicino evento di redableStream quando pipin unles si usano le opzioni per mantenere scrivibile apribile perché in questo caso writableStream è terminato da pipe. – jlvaquero

+0

Ho finalmente risolto quella parte, ma sto ancora ricevendo '[SyntaxError: Unexpected token {]' come un messaggio di errore in req.end, tutto quello che sto facendo sul lato client è: 'response.json ({" hi ": "ciao"}); ' – bubakazouba

3

Fondamentalmente JavaScript è asincrono e ruscello o connessione socket è synchronus, Una volta creato un flusso è necessario attendere per il flusso di chiudere per fare un'altra richiesta di

Nel tuo caso la req.end sempre eseguito una volta è stato aperto il flusso

tre opzioni a disposizione fanno per essere il lavoro

  1. Prova con l'agente chai
  2. inserire il codice nel flusso vicino perché sia ​​chai.end e s end tream sembra essere lo stesso per lo scenario
  3. put req.end all'interno setTimeOut (non ha provato può essere per caso peggiore)
2

Quando tubazioni, per impostazione predefinita, end() è chiamato nella destinazione quando il flusso di fonti emette l'evento 'end'. Quindi non devi chiamare lo end() da solo.

Iscriviti alla 'finish' e 'error' evento del flusso di destinazione per controllare quando il lavoro è fatto o quando un errore si verifica:

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

Se si desidera mantenere lo scrittore (req) apre è possibile impostare end option false quando si collegano le tubazioni:

fs.createReadStream('./test.wav').pipe(req, options = {end = false}); ma si tenga presente che l'evento 'fine' non verrà attivato dalla pipe.

+0

qual è la differenza tra 'finish' e' end'? – bubakazouba

+0

I flussi scrivibili non hanno evento finale. – jlvaquero

+0

'finish' non viene mai chiamato, solo il mio' end' fa. – bubakazouba