我从浏览器获取“POST”值到nodejs和express。
我将文件发布到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'));
});
可以接收post文件。
但我已将文件大小限制设置为 50mb。
当我发布的文件大小大于 50mb 时。
浏览器将继续上传文件直至完成。
我需要的是当大小大于 50mb 时。它向浏览器响应 413(请求实体太大,这就是错误打印出来的内容)http 代码,停止上传。
我调查了 Express 源代码。
它使用位于
的连接
第 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();
};
};
这里发生的是第一个“如果”:
// 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();
}
});
这似乎有效,但我不确定这是否是正确的方法。