0
前述のように、supertestを使用してkoaサーバで複数のポストリクエストを実行しようとしています。以下のコードで確認できます。複数のポストリクエストでkoa/supertestがハングする
DEBUG=koa* mocha --harmony_destructuring --sort --require co-mocha --timeout 0 "test.js"
でスクリプトを実行すると、2番目のポストリクエストのためにディスパッチするだけです。サーバーへの2番目の接続は何とか開いたままです(leaked-handlesデバッグ出力を参照)。 GET要求はうまく処理されます。私はそれがどういうわけか、私はどちらかそれらのいずれかを実行している場合に動作していることが分かった:
- 削除「次の収量(明らかにオプションではありません)「.send(データ)」ポストデータが無効、すなわち送信しない
- 本当にだろう、私は
'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);
});
});
});
この場合、「yield next」の目的は何ですか? 2回目の 'GET'テストが' r.get() 'ルートハンドラを2回トリガすることに気づいていましたか?(' r.get() 'を3回呼び出すことができます。 – robertklep
私は質問を正しく理解しているかどうか分からないが、チェーン内の次のミドルウェアが次のコールを呼び出すので、最後にロガーがあり、ベンチマークのためにそれを使用する。私のルートの。 GETリクエストに関して、私は気づいていませんでした。そして、それはなぜ、しかし病気にかかりません。 – cdx
oh my ...私はそれを見つけました: "var app = require( 'koa')();"エラーの原因である場合、関数は "www"関数内で呼び出される、つまり "var koa = require( 'koa');に分割する必要があります。その後、www "var app = koa();" 私は今私自身の質問に答える必要があると思いますか? – cdx