我如何限制node.js中服务器的上传速度?

jco*_*and 13 performance upload file-upload limit node.js

我如何限制node.js中服务器的上传速度?

这甚至是一种选择吗?

场景:我正在编写一些方法,允许用户自动将文件上传到我的服务器.我想将上传速度限制为(例如)50kB/s(当然可配置).

Tom*_*Tom 16

我认为您不能强制客户端以预定义的速度进行流式传输,但您可以控制整个过程的"平均速度".

var startTime  = Date.now(),
    totalBytes = ..., //NOTE: you need the client to give you the total amount of incoming bytes
    curBytes   = 0;

stream.on('data', function(chunk) { //NOTE: chunk is expected to be a buffer, if string look for different ways to get bytes written
     curBytes += chunk.length;
     var offsetTime = calcReqDelay(targetUploadSpeed);
     if (offsetTime > 0) {
         stream.pause();
         setTimeout(offsetTime, stream.resume);
     }
});

function calcReqDelay(targetUploadSpeed) { //speed in bytes per second
    var timePassed = Date.now() - startTime;
    var targetBytes = targetUploadSpeed * timePassed / 1000;
    //calculate how long to wait (return minus in case we actually should be faster)
    return waitTime;
}
Run Code Online (Sandbox Code Playgroud)

这当然是伪代码,但你可能得到了重点.可能还有另一种更好的方式,我不知道.在这种情况下,我希望其他人会指出它.

请注意,它也不是很精确,您可能希望使用与平均速度不同的度量标准.

  • @drachenstern,这个想法完全有效.限制上传速度有很多原因.例如,您可能希望提供高级计划,或者您可能只是希望将这些上传保留在您的网站上更长的时间(更高的广告解读率)以及其他原因.我不确定,但它也可能更均匀地分配资源使用,从而提高性能(但同样,我不完全确定这个). (3认同)

End*_*ess 7

使用节流模块来控制管道流速度

npm install throttle

var Throttle = require('throttle');

// create a "Throttle" instance that reads at 1 b/s 
var throttle = new Throttle(1);

req.pipe(throttle).pipe(gzip).pipe(res);
Run Code Online (Sandbox Code Playgroud)