1

我正在尝试为我的应用程序编写一个测试,在那里我使用express-brute来防止暴力攻击。

我有以下测试:

it('should return 429 status after 1000 attempts', function (done) {
    this.timeout(5000);

    var counter = 0;

    var makeRequest = function (count, done) {
        counter++;
        request(app)
        .post('/login')
        .send({ username: 'a+' + count + '@b.com', password: 'wrong' + count })
        .end(function (err, res) {

            if (err) {
                console.log('failed request #', counter); 
                return done(err);
            }

            if (counter < 1001) {
                makeRequest(counter, done);
            }
            else {
                res.header.location.should.equal('/account/login');
                res.statusCode.should.equal(429);
                done();
            }
        });
    }

    makeRequest(counter, done);
});

哪个会引发错误:

错误:套接字挂断有时是错误:读取ECONNRESET

它总是围绕连接#225

相同的测试(只有 20 个左右的请求)工作正常(如果我更改我的 express-brute 配置)

是什么导致它出错?

我没有正确关闭/处理连接吗?

4

2 回答 2

2

您使用什么操作系统?

可能需要增加允许打开的套接字的数量。

例如,请参见此处:如何增加 osx 上的套接字限制以进行负载测试?

于 2014-03-08T18:03:17.287 回答
0

我能够通过使用此代码复制资源耗尽问题,我相信它复制了您问题的本质:

var request = require("supertest");
var express = require("express");

var app = express();

app.post('/login',
    function (req, res, next) {
        res.send('Success!');
    }
);

var server = app.listen();

var counter = 0;

function makeRequest(count, done) {
    counter++;
    request(app)
        .post('/login')
        .send({ username: 'a+' + count + '@b.com', password: 'wrong' + count })
        .end(function (err, res) {

            if (err) {
                console.log('failed request #', counter);
                done(err);
            }

            if (counter < 1001) {
                console.log(counter);
                makeRequest(counter, done);
            }
            else {
                console.log(res);
                done();
            }
        });
}

function done(err) {
    process.exit(1);
}

makeRequest(counter, done);

并像这样运行它:

$ (ulimit -n 100; node test.js )

我必须使用ulimit,因为无论什么原因导致您的问题都不会发生在我的操作系统上。该ulimit命令将打开文件的数量限制为 100。当我像上面那样运行它时,请求号 89 失败。(打开了许多其他文件来运行脚本,这解释了为什么它在请求 89 而不是 100 时失败。)

如果我更改代码以便从我的应用程序创建服务器,我可以让代码运行完成:

var app = express();
// ...
var server = app.listen();

我使用serverinrequest而不是app

request(server)
    .post('/login')
// ...

所以使用什么app.listen()回报应该解决这个问题。

于 2014-03-08T20:38:07.703 回答