2016-01-02 4 views
7

クライアントからオーディオストリームを受信するserver-appがあります。私はchai/chai-httpを使用してアプリケーションをテストしようとしていますが、それは私に、このエラーを与える:chai-http write after end

[Error: write after end]

問題は何?

コード:

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

答えて

5

ストリームが要求にデータをプッシュ終了する前にあなたはreq.endを呼んでいます。

私は、次の操作を行います:

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

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

とストリームのためのイベント近いまたは最後にreq.endを呼び出します。これらのイベントのいずれかが発行される前に、req.endを呼び出しています。

+0

私は 'readtime.on( 'end')'コールバックの中に 'req.end'を入れました。それは私にエラーを与え続けます – bubakazouba

+0

終了時または終了時にwritableStream.end()を呼び出さないでくださいこのイベントではwritableStreamがパイプで終了するため、pipable unleを使用するとredableStreamのイベントが書き込み可能な状態を維持するためのオプションを使用します。 – jlvaquero

+0

私は最終的にその部分を修正しましたが、req.endのエラーメッセージとして[SyntaxError:予期せぬトークン{] 'が残っています。クライアントサイドでやっていることはすべて、' response.json({"hi" "bye"}); ' – bubakazouba

3

あなたが開いた後req.endが実行取得あなたのケースでは、あなたが別の要求

を作るために閉鎖するストリームを待つ必要がストリームを作成した後は基本的には、JavaScriptがasynchronusストリームであるか、ソケット接続がsynchronusです仕事

  1. 近いchai.endとの両方のためのストリームにあなたのコードを入れてチャイエージェント
  2. で試してみてくださいことを行うことが可能なストリーム

    3つのオプションtreamの終わりには、デフォルトでは、end()は、ソースストリーム先に呼び出された配管のsetTimeout(最悪の場合であってよいが試したしませんでした)

2

内req.endシナリオ

  • プットのために同じであるように思わ'end'イベントを発します。だから、あなた自身でend()に電話する必要はありません。仕事はそれが行われたときやエラーが発生したときに制御するための宛先ストリームの'finish''error'イベントへ

    Suscribe:

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

    あなたがライター(req)のオープンを維持したい場合は、設定することができます

    fs.createReadStream('./test.wav').pipe(req, options = {end = false});パイプには「完了」イベントが発生しないように注意してください。end optionをfalseに設定してください。

  • +0

    'finish'と' end'の違いは何ですか? – bubakazouba

    +0

    書き込み可能なストリームには終了イベントがありません。 – jlvaquero

    +0

    'finish'は呼び出されません。私の' end'だけが呼び出します。 – bubakazouba

    関連する問題