ホームページ >ウェブフロントエンド >フロントエンドQ&A >Nodejs は 413 エラーを解決します

Nodejs は 413 エラーを解決します

WBOY
WBOYオリジナル
2023-05-27 20:41:361016ブラウズ

Node.js を使用して Web アプリケーションを開発する場合、大きなファイルのアップロードを処理する必要がある状況に遭遇することがあります。ただし、アップロードされたファイルが大きすぎる場合、HTTP 413 Request Entity Too Large エラーが発生する可能性があります。これは、Node.js のリクエスト本文のサイズ制限がデフォルトで 100KB に設定されているためです。リクエスト エンティティのサイズがこの制限を超えると、HTTP 413 エラーが発生します。

この問題を解決するには、いくつかの方法から選択できます。

  1. リクエスト本文の制限を変更する

解決策の 1 つは、デフォルトのリクエスト本文のサイズ制限を変更して、アップロード ファイルのサイズ制限を増やすことです。 Node.js では、body-parser モジュールを使用してリクエスト本文を解析できます。このモジュールのオプションの 1 つは limit で、これを使用してリクエスト本文を変更できます。サイズ制限。

const express = require('express')
const bodyParser = require('body-parser')

const app = express()

// limit设置为50MB
app.use(bodyParser.json({limit: '50mb'}))
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}))

// 处理文件上传的请求
app.post('/upload', (req, res) => {
  // ...
})

app.listen(3000, () => {
  console.log('服务器启动成功')
})

上記のコードを使用すると、リクエスト本文の制限を 50MB に増やすことができます。ただし、リクエスト本文が大きくなるとメモリも大量に消費されるため、この方法は非常に大きなファイルのアップロードリクエストの処理には適していません。

  1. ストリームを使用してリクエスト本文を処理する

アップロードされたファイルが大きい場合、リクエスト本文全体をメモリに読み取るとパフォーマンスの問題が発生する可能性があります。この問題を回避するために、Node.js はリクエスト本文をストリームとして処理できる Stream API を提供します。

ストリームとバッファの最大の違いは、ストリームはデータをバッチでメモリに読み込めることです。この方法では、リクエスト本文が非常に大きい場合でも、サーバーのメモリに過度の負担をかけることはありません。

const express = require('express')
const app = express()
const BUSBOY = require('busboy')

app.post('/upload', (req, res) => {
  const busboy = new BUSBOY({ headers: req.headers })
  busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
    console.log('文件名:', filename);
    file.on('data', function(data) {
      console.log('文件大小为:', data.length);
    });
    file.on('end', function() {
      console.log('文件上传成功');
    })
  })

  busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
    console.log('表单字段:', fieldname, val);
  })

  busboy.on('error', function(err) {
    console.log('文件上传失败:', err);
    res.status(500).send('文件上传失败')
  })

  req.pipe(busboy)
})

上記のコードは、busboy ライブラリを使用しています。これは、アップロードされたファイルの解析を複数のストリーム イベントに分解できる読み取り/書き込みストリーム API です。

  1. Nginx の使用

Node.js を使用して大きなファイルのアップロード要求を処理する場合、アプリケーションの背後に Nginx ゲートウェイ サーバーを追加できます。 Nginx はリバース プロキシとして機能するため、リクエスト本文のサイズ制限の問題を軽減できます。

リクエスト本文のサイズが制限を超えると、Nginx はリクエストを拒否し、HTTP 413 エラーを返すことがあります。 Nginx 構成を調整するには、次の内容を /etc/nginx/nginx.conf ファイルに追加します。

http {
  client_max_body_size 1000M;
  upstream app_servers {
    server localhost:3000;
  }
  server {
    listen 80;
    server_name yourdomain.com;
    location / {
      proxy_pass http://app_servers;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-NginX-Proxy true;
    }
  }
}

Use client_max_body_size を使用して、リクエスト本文のサイズ制限を変更します。 。上記のコードは、リクエスト本文のサイズ制限を 1000MB に設定します。

結論

大きなファイルのアップロードを処理するときに、HTTP 413 リクエスト エンティティが大きすぎるという問題が発生する可能性があります。この記事では、リクエスト本文の制限を変更する、Streams を使用してリクエスト本文を処理する、Nginx を使用するという 3 つの解決策を紹介します。アプリケーションのニーズに基づいて、大きなファイルのアップロード要求を処理するための適切な方法を選択できます。

以上がNodejs は 413 エラーを解決しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。