当文件大小超过nodejs中的限制并且expression时,如何响应客户端或浏览器

我从浏览器获取“POST”值到nodejs并表示。
我将文件发布到nodejs。
下面是代码。

var express = require('express') , routes = require('./routes') , http = require('http'); var app = express(); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); //app.use(express.bodyParser()); app.use(express.bodyParser({ uploadDir: __dirname + '/upload', keepExtensions: true, limit: '50mb' })); app.use(express.limit('35mb')); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); app.post('/', function(request, response){ console.log(request.body.upfile); console.log(request.files); var ret = {a:'a',b:'b'}; response.writeHead(200, { 'Content-Type': 'application/json'}); response.write(JSON.stringify(ret)); response.end(); }); http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); }); 

它可以接收邮件文件。
但是我已经将文件大小限制设置为50MB。
当我发布的文件大小超过50MB。
浏览器将继续上传文件直到完成。
我需要的是当尺寸大于50mb。 它响应413(请求实体太大,这是表示错误打印出来)的http代码,以阻止它上传的浏览器。

我已经研究了快速源代码。
它使用连接find
第45行的node_modules / express / node_modules / connect / lib / middleware / limit.js。
它将413和调用堆栈logging到stdio。
我想我可以在这里做的伎俩来响应与HTTP代码的浏览器。
但是当我testing它。 浏览器打印重置。
以下是修改代码。

 module.exports = function limit(bytes){ if ('string' == typeof bytes) bytes = utils.parseBytes(bytes); if ('number' != typeof bytes) throw new Error('limit() bytes required'); return function limit(req, res, next){ var received = 0 , len = req.headers['content-length'] ? parseInt(req.headers['content-length'], 10) : null; // self-awareness if (req._limit) return next(); req._limit = true; // limit by content-length if (len && len > bytes) { var ret = {a:'bbbbb',b:'b'}; res.writeHead(413); res.write(JSON.stringify(ret)); res.end(); return next(utils.error(413)); } // limit req.on('data', function(chunk){ received += chunk.length; if (received > bytes) req.destroy(); }); next(); }; }; 

这里发生的是第一个“如果”:

 // limit by content-length if (len && len > bytes) { var ret = {a:'bbbbb',b:'b'}; res.writeHead(413); res.write(JSON.stringify(ret)); res.end(); return next(utils.error(413)); } 

仅在浏览器发送“content-length”标题时才被执行,但并非总是如此。 大多数情况下,它会回落到这里飞行的字节计数:

 // limit req.on('data', function(chunk){ received += chunk.length; if (received > bytes) req.destroy(); }); 

但是正如你所看到的,当它超过了允许的限制时,它只会销毁请求,这会导致浏览器重置消息。 你可以改变它是这样的:

 // limit req.on('data', function(chunk){ received += chunk.length; if (received > bytes) { var ret = {a:'bbbbb',b:'b'}; res.writeHead(413); res.write(JSON.stringify(ret)); res.end(); } }); 

这似乎工作,但我不知道这是否是正确的方式来做到这一点。