2016-07-06 5 views
0

前述のように、supertestを使用してkoaサーバで複数のポストリクエストを実行しようとしています。以下のコードで確認できます。複数のポストリクエストでkoa/supertestがハングする

DEBUG=koa* mocha --harmony_destructuring --sort --require co-mocha --timeout 0 "test.js" 

でスクリプトを実行すると、2番目のポストリクエストのためにディスパッチするだけです。サーバーへの2番目の接続は何とか開いたままです(leaked-handlesデバッグ出力を参照)。 GET要求はうまく処理されます。私はそれがどういうわけか、私はどちらかそれらのいずれかを実行している場合に動作していることが分かった:

  • 削除「次の収量(明らかにオプションではありません)「.send(データ)」ポストデータが無効、すなわち送信しない
  • 本当にだろう、私は

「(< --- HERE」のコードで
  • 参照)得られていないルートが装着された後、ミドルウェアを導入(私がすることを望んでいない)、ポストルートで」それがなぜ、私がここで間違っているのかを理解するのが好きですe-回避策は悪いことです。

    'use strict'; 
    
        require('leaked-handles').set({ 
         fullStack: true, 
         timeout: 5000, 
         debugSockets: true 
        }); 
    
        var http = require('http'); 
        var app = require('koa')(); 
        var router = require('koa-router'); 
        var body = require('koa-body')(); 
        var compose = require('koa-compose'); 
    
        var www = function() { 
         var r = router(); 
         r.get('/test', function * (next) { 
          this.body = 200; 
          yield next; 
         }); 
         r.post('/test', body, function * (next) { 
          console.log(this.request.body); 
          this.body = {status: 200}; 
          yield next; 
         }); 
    
         app.use(compose([ 
          r.routes(), 
          r.allowedMethods() 
         ])); 
    
         // app.use(function * last (next) {/* do not yield */}); // <---- 
    
         var server = http.createServer(app.callback()); 
         return server; 
        }; 
    
    
        var supertest = require('supertest'); 
        var expect = require('chai').expect; 
    
        describe('testing server',() => { 
    
         var agent, server; 
         var data = {test: 123}; 
    
         beforeEach(function() { 
          server = www(); 
          agent = supertest(server.listen()); 
         }); 
    
         afterEach(function (done) { 
          server.close(done); 
         }); 
    
         describe('get',() => { 
          it('returns ok', (done) => { 
           agent.get('/test').expect(200, done); 
          }); 
          it('returns ok', (done) => { 
           agent.get('/test').expect(200, done); 
          }); 
         }); 
    
         describe('post 1',() => { 
          it('returns ok', (done) => { 
           agent.post('/test') 
            .send(data) 
            .expect(200, done); 
          }); 
         }); 
    
         describe('post 2',() => { 
          it('returns ok', (done) => { 
           agent.post('/test') 
            .send(data) 
            .expect(200, done); 
          }); 
         }); 
    
        }); 
    
  • +0

    この場合、「yield next」の目的は何ですか? 2回目の 'GET'テストが' r.get() 'ルートハンドラを2回トリガすることに気づいていましたか?(' r.get() 'を3回呼び出すことができます。 – robertklep

    +0

    私は質問を正しく理解しているかどうか分からないが、チェーン内の次のミドルウェアが次のコールを呼び出すので、最後にロガーがあり、ベンチマークのためにそれを使用する。私のルートの。 GETリクエストに関して、私は気づいていませんでした。そして、それはなぜ、しかし病気にかかりません。 – cdx

    +0

    oh my ...私はそれを見つけました: "var app = require( 'koa')();"エラーの原因である場合、関数は "www"関数内で呼び出される、つまり "var koa = require( 'koa');に分割する必要があります。その後、www "var app = koa();" 私は今私自身の質問に答える必要があると思いますか? – cdx

    答えて

    0

    上記のコメントに記載されているとおり、私は問題を見つけました。 その基本的にこの行は:私はまだ実際に行動を起こすかわからないんだけどが、自身が持っている

    var app = require('koa')(); 
    

    KOAは、WWWの機能、すなわち

    var koa = require('koa'); 
        ... 
        var www = function() { 
         var app = koa(); 
         ... 
        } 
        ... 
    

    内でインスタンス化されるように、これはそれを正しく修正されています。

    関連する問題