Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何测试速率受限的HTTP请求功能?_Javascript_Node.js_Mocha.js_Chai_Rate Limiting - Fatal编程技术网

Javascript 如何测试速率受限的HTTP请求功能?

Javascript 如何测试速率受限的HTTP请求功能?,javascript,node.js,mocha.js,chai,rate-limiting,Javascript,Node.js,Mocha.js,Chai,Rate Limiting,我有一个从Node.js向其发出HTTP请求的外部服务。该服务目前的限制是每秒只能发出10个请求。我有一个幼稚的速率限制器,我写了,我试图测试,但下降的时机。我知道,但是我得到了非常不同的摆动,在高达50毫秒的范围内 以下是我所做工作的要点: var RATE_LIMIT_MS = 100 // No more than 10 requests per second var NEXT_WAIT_MS = 0 function goGetRequest(...) { return new

我有一个从Node.js向其发出HTTP请求的外部服务。该服务目前的限制是每秒只能发出10个请求。我有一个幼稚的速率限制器,我写了,我试图测试,但下降的时机。我知道,但是我得到了非常不同的摆动,在高达50毫秒的范围内

以下是我所做工作的要点:

var RATE_LIMIT_MS = 100 // No more than 10 requests per second
var NEXT_WAIT_MS = 0

function goGetRequest(...) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            function complete() {
                // Rollback next time after this request finishes
                NEXT_WAIT_MS = Math.max(0, NEXT_WAIT_MS - RATE_LIMIT_MS)
            }

            // ... requests are fired off here asynchronously...
            http.get(...).then(complete)

        }, NEXT_WAIT_MS)

        // Push time back on the queue
        NEXT_WAIT_MS += RATE_LIMIT_MS
    })
}

var chai = require('chai')
var expect = chai.expect

it('should rate limit requests properly', function() {
    var iterations = [0, 1, 2, 3, 4]
    var lastResponseMs = 0

    var promises = iterations.map(function(i) {
        return goGetRequest(...).
            then(function(result) {
                // Diff the times
                var thisResponseMs = Date.now()
                var thisDiffMs = Math.abs(thisResponseMs - lastResponseMs)

                expect(wrapper.results).to.not.be.empty
                expect(thisDiffMs, 'failed on pass ' + i).to.be.at.least(RATE_LIMIT_MS)

                // Move last response time forward
                lastResponseMs = thisResponseMs
            })
    })

    return Promise.all(promises)
})

接下来的情况是,测试将在随机通过时失败。过程2上的时间差为92毫秒,过程4上的时间差为68毫秒。。。。我错过了什么?谢谢

Javascript setTimeout和setInterval(与任何非实时代码一样)从来都不精确。但是,如果您使用的是NodeJS,则可以尝试使用Nanotimer:

或者,我建议只测试发生率限制,而不必太担心精确性。如果您连续发送11个请求(这可能需要不到1秒的时间),并且它被阻止,1秒后就可以了,那么您的测试就可以被认为通过了


最后一个解决方案是使用
exec()
并调用操作系统
sleep
命令,该命令非常精确。

我不太明白您在问什么。您是否正在询问如何将您的速率限制器限制为每秒10个请求?或者你是在问其他问题(关于测试)?
var NanoTimer = require('nanotimer');

var timerA = new NanoTimer();

timerA.setTimeout(yourFunction, '', NEXT_WAIT_MS);