2012-07-23 51 views
1

我从浏览器获取“POST”值到nodejs并进行表达。
我将文件发布到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代码到浏览器停止它上传。

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

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(); 
    }; 
}; 

回答

1

这里发生的是那首“如果”:

// 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(); 
}); 

但你可以看到,当它经过允许的极限它只是破坏了要求,这会导致重置消息从浏览器。你可以改变它是这样的:

// 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(); 
    } 
}); 

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

+0

不,流量落在if语句中。我确定。 – Magic 2012-07-24 01:25:50

相关问题