2016-07-06 50 views
0

正如上面提到的,我試圖在超級用戶的koa服務器上做多個帖子請求。正如你在下面的代碼中看到的那樣。當腳本通過執行koa/supertest掛在多個帖子請求上

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

它只是在爲第二個發佈請求分派時掛起。到服務器的第二個連接永遠保持打開狀態(請參閱leaked-handles調試輸出)。 GET請求處理得很好。我發現它在某種程度上工作,如果我做任何其中的一個:

  • 不發送數據後,即禁止「發送(數據)」(這顯然不是一個選項)
  • 刪除「未來產量「在後的路線(我不希望出現這種情況)
  • 引入中間件後的路由連接不產生(見」 < --- HERE」中的代碼)

我真的喜歡理解這是爲什麼,以及我在這裏做錯了什麼,因爲我認爲介紹這個怪異的不屈服中間戰爭電子解決方法只是很糟糕。

'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'的用途是什麼?你有沒有注意到第二個'GET'測試觸發了'r.get()'路由處理器兩次(所以總共有3次調用'r.get()'),這看起來很奇怪。 – robertklep

+0

我不確定如果我正確地理解了這個問題,但是接下來會調用鏈中的下一個中間件,所以您最終會有一個記錄器或者將它用於基準測試,因此我希望堅持所有下一步的產量我的路線。關於GET請求,我沒有注意到,並且我也不確定這是爲什麼,但是病入侵。 – cdx

+0

哦,我的...我發現它:在「var app = require('koa')();」是錯誤的原因,這個函數應該在「www」函數內調用,即將它分成「var koa = require('koa');」然後在www「var app = koa();」 我想我現在必須回答我自己的問題? – cdx

回答

0

好吧,正如在上面的評論中提到的,我發現了什麼問題。 它基本上這條線:

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

興亞本身要在WWW功能即

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

內。雖然我還是不知道究竟是什麼導致出現該問題實例,這個正確修復它。