nodejs和express中post文件大小超过限制时如何响应客户端或浏览器

问题描述 投票:0回答:1

我从浏览器获取“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();
  };
};
node.js express httpconnection
1个回答
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));
}

仅当浏览器发送“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();
  }
});

这似乎有效,但我不确定这是否是正确的方法。

© www.soinside.com 2019 - 2024. All rights reserved.