繁体   English   中英

如果大小太大,如何终止node.js http请求?

[英]How to terminate node.js http request if size is too large?

如果用户的请求大于8mb,我想终止node.js进程中的http服务器。 我当前的代码似乎可以在基本测试中正常工作,但是我不确定res.end()是否异步,是否可以在被process.exit()完成之前销毁。 我在这里使用process.exit是因为,如果用户的请求大于8mb,则在他们发送大量数据时,我不需要保持进程活动。

req.on('data', (chunk) => {
    body += chunk;
    if(body.length > 8000000) {
        res.writeHead(413, defaultHead);
        res.end('{"error":"Request exceeded 8mb maximum size."}');
        process.exit(0);
    }
});

您这样做的方式将起作用,因为body-parser可以完成同样的事情, body-parser是用于解析req.body中的req.body的流行软件包。

现在, body-parser工作方式是,它使用另一个名为raw-body包,该包带有limit参数,如果当前块> limit,它将调用传递的回调。

  function onData (chunk) {
    if (complete) return

    received += chunk.length

    if (limit !== null && received > limit) {
      done(createError(413, 'request entity too large', {
        limit: limit,
        received: received,
        type: 'entity.too.large'
      }))
    } else if (decoder) {
      buffer += decoder.write(chunk)
    } else {
      buffer.push(chunk)
    }
  }

done是这里的回调,它会产生一个错误并将其作为回调中的第一个参数推送。

body-parser代码中:

getBody(stream, opts, function (error, body) {
  if (error) {
    var _error= createError(400, error)

    // read off entire request
    stream.resume()
    onFinished(req, function onfinished () {
      next(createError(400, _error))
    })
    return
  }

  ....
  next()
})

如果发生错误,它仅使用stream.resume()读取整个流并传递错误。 因此,基本上,您正在复制一个简单的版本,理论上应该可以使用。

注意, onFinished是另一个程序包,当HTTP请求关闭,完成或出错时,该程序包执行回调。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM