如上所述,我试图在具有超级特权的koa服务器上进行多个帖子请求。正如您在下面的代码中看到的那样。当脚本通过
执行时DEBUG=koa* mocha --harmony_destructuring --sort --require co-mocha --timeout 0 "test.js"
它只是在调度第二个帖子请求时挂起。与服务器的第二个连接以某种方式永远保持打开状态(请参阅泄漏处理调试输出)。 GET请求处理正常。我发现,如果我做其中任何一个,它会以某种方式起作用:
我真的很想理解为什么会这样,以及我在这里做错了什么,因为我认为介绍那些糟糕的不产生中间件的解决方案是不好的。
'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 :(得分:0)
好的,正如上面评论中提到的,我发现了问题。 它基本上就是这一行:
var app = require('koa')();
koa本身必须在www函数中实例化,即
var koa = require('koa');
...
var www = function () {
var app = koa();
...
}
...
虽然我仍然不确定究竟是什么原因引起了这种行为,但这正确地解决了这个问题。