koa / supertest挂起多个帖子请求

时间:2016-07-06 20:35:35

标签: javascript node.js mocha koa supertest

如上所述,我试图在具有超级特权的koa服务器上进行多个帖子请求。正如您在下面的代码中看到的那样。当脚本通过

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

它只是在调度第二个帖子请求时挂起。与服务器的第二个连接以某种方式永远保持打开状态(请参阅泄漏处理调试输出)。 GET请求处理正常。我发现,如果我做其中任何一个,它会以某种方式起作用:

  • 不发送帖子数据,即禁用" .send(数据)" (显然不是一个选择)
  • 删除"下一步产生"在后期路线(我不想要)
  • 在附加路由后引入中间件但不产生(参见"< --- 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);
            });
        });

    });

1 个答案:

答案 0 :(得分:0)

好的,正如上面评论中提到的,我发现了问题。 它基本上就是这一行:

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

koa本身必须在www函数中实例化,即

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

虽然我仍然不确定究竟是什么原因引起了这种行为,但这正确地解决了这个问题。