簡體   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