質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

3281閲覧

node.js express 環境 で multipart/form-data で送られてきた画像データ受信時のstreamが途中で止まる

h451

総合スコア8

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/08/18 02:21

編集2020/08/18 02:47

クライアント側からフォームデータ("multipart/form-data")で入力してもらった画像データをサーバーサイド(海外レンタルサーバー ram 1GB と貧弱)で受け取った時、streamが途中で止まってしまうという現象が起きてしまいました(コネクションはつながったまま)。エラーはでておりません。
色々と試しましたが、どう解決すればよいかわからないので質問しました。
どなたかデータ送受信に詳しいかた、この現象の原因として考えられそうなことを教えていただけないでしょうか。
Local環境(windows10)で行った場合このような現象は起きませんでした。
送信はaxios,受信はbusboyで行っております。multer,formidableなども試しましたが同様に無理だったので受信モジュールのバグではないと思います。
nuxtを使っており、本番環境時もlocal環境時もwebサーバーとapiサーバーは同じノードの中に立っています。
よろしくお願いいたします。

クライアント側

javascript

1 let formData = new FormData(); 2 formData.append( 3 "data", 4 JSON.stringify({ user_id: this.dbuser.id, image_type: "icon" }) 5 ); 6 formData.append("file", file); 7 this.$axios 8 .post(`${process.env.WEB_URL}/file/imageUpload`, formData, { 9 headers: { 10 "Content-Type": "multipart/form-data", 11 }, 12 }) 13 .then((res) => { 14 alert("Done") 15 }) 16 .catch((err) => { 17 console.log(err); 18 });

サーバー側

javascript

1app.post("/imageUpload", (req, res, err) => { 2 3 var busboy = new Busboy({ headers: req.headers }); 4 5 busboy.on('field', function (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) { 6 7 }); 8 busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 9 file.on('data', function (data) { 10 console.log(data) ←←←ここでチャンクをコンソール(ログ結果は下に示します) 11 }); 12 file.on('end', function () { 13 }); 14 }); 15 16 busboy.on('finish', function () { 17 console.log("fin") 18 res.send("Done"); 19 }); 20 21 return req.pipe(busboy); 22})

サーバー側のコンソール出力結果(file.on('data') の内部)
<失敗時(海外レンタルサーバー本番環境)>

<Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 90 00 00 01 90 08 02 00 00 00 0f dd a1 9b 00 00 20 00 49 44 41 54 78 01 ec c1 fb d3 e6 f7 5d ... 1065 more bytes>
<Buffer d4 5a 2f 5f 3c 7f ea d4 a9 97 5e 7a f1 f5 b3 67 b7 b7 76 e6 f3 6e 01 9c 69 9c 25 a2 1d 8f 96 97 96 d7 d6 d7 0e ad ad 1d 3b 76 ec c8 fa da fa da da a1 ... 8230 more bytes>
<Buffer 81 0c 03 54 d2 b1 66 62 66 52 fb de 81 71 a4 e7 51 a5 ce 9c e7 ca b5 87 df f2 ee 5f 96 be fd 96 3b ef ba f9 d6 23 cf c2 86 4d 76 7b 4f d6 dd 7e ce d9 ... 2710 more bytes>
~中略(local環境と違い、60行ほどありました。海外レンタルサーバーで通信速度が遅いためと思われます。ここに原因が潜んでいると考えますが、なにが原因かわかりません...エラーが起こらないのでタイムアウトのせいではないと考えております。)~
<Buffer b6 d3 71 a1 31 4d 4b 34 28 08 bb 6b 55 3a 48 aa 88 44 a6 6b 19 f4 d8 a8 23 3a 7a a0 02 1e f9 7b d7 7c ff af 3e fe e5 b9 5c b6 bd 9d 39 f5 dc 63 df fc ... 1330 more bytes>
<Buffer 5e b6 ec 25 bf fe c1 df 99 9a 5c de 75 41 cc 6b 90 70 6d 55 83 fa e8 43 ff fc d9 cf 7e ea 63 1f 3b ff ba 4b 6e bf f4 f2 fb 7e f5 03 bf b0 65 cb a6 af ... 2710 more bytes>
<Buffer ae c8 e9 10 06 64 1b 24 43 68 87 34 45 48 02 39 90 0d 61 0c d9 60 5b 4e db 09 54 f0 3c 05 06 db 2a 69 23 02 2b 90 c2 38 10 f3 14 60 cc 38 0a cd 40 83 ... 1330 more bytes>
<Buffer c4 13 e5 17 ff fd ef ef f1 d2 3d 37 af 7f e0 8b 7f fa c7 df bf e7 fe c3 8f 38 e8 9c 73 4e 59 be d3 64 43 53 b7 93 fd d6 6e 76 fb e6 8d 5b 6f bd e5 7b ... 631 more bytes>
←ここでとまる。コネクションはつながったまま。

<成功時(localのテスト環境時)>

<Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 90 00 00 01 90 08 02 00 00 00 0f dd a1 9b 00 00
20 00 49 44 41 54 78 01 ec c1 57 9b 64 d9 79 ... 65209 more bytes>
<Buffer 55 46 83 4b 51 a8 d8 d9 2e 36 36 07 1b c7 ad e5 d5 89 b3 8b ae e1 04 c1 a5 c8 eb a0 59 08 8a 26 c0 79 55
bd c1 71 7b 6f f2 dc 99 64 62 9a 79 9d e6 65 ... 65486 more bytes>
<Buffer c2 1d 05 b3 65 b0 6a aa fd 1f ff c7 ea 83 bb 83 6b d7 36 be f5 dd 38 bf 6c 52 70 b7 54 6b da 58 4e 26 97
23 c5 42 b9 09 06 0c 06 9e 33 3c ab 28 48 03 ... 65486 more bytes>
<Buffer 73 0a 10 e7 14 63 c4 98 e2 9f 41 40 31 46 40 71 8e 80 62 8c f8 36 22 50 d5 2b 04 e7 14 ff 15 ef 4a 63 23
80 00 08 0d 50 05 e0 9d 3a 47 31 c6 5a a8 a2 ... 65486 more bytes>
<Buffer e1 82 5c cc 40 43 6a 3c 46 24 29 26 b5 f2 b6 d2 74 e6 75 fd f4 de 87 5b 1f fc 58 ed b4 2d 7b e5 d2 e8 ea
4b d7 e7 96 06 2c 89 90 21 80 82 52 0e 64 34 ... 2809 more bytes>
fin ←成功時はbusboy.on('finish')が呼び出され完了している。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

画像データをサーバーサイド(海外レンタルサーバー ram 1GB と貧弱)で受け取った時、

RAM1GB ということなので、Google検索NodeJS --max-old-space-size は要調査です。

NodeJS はデフォルトで 1GB を超えるメモリをヒープ領域として確保しようとするのが原因と思います。
処理速度を犠牲にして、メモリ消費の上限を定めると改善されるかもしれません。

また、信経路上のストリームについてはRFC multipart/form-dataで仕様がわかるはずです。

busboy を使っているとのことですので、 npm busboy ページの 「Save all incoming files to disk」セクションで例示されているように、pipe(writableStream) で直接ファイルシステムに保存する方が、メモリ消費を抑制できると思います(同ページの API 解説 は要再確認です)。


受信した画像が大きすぎる場合、child_process でサーバーOSのコマンドを呼ぶ方法も考えられます(NodeJSによるメモリ消費を抑制する対策になるかもしれません)。

メモリと HDD(SSD) とではI/O速度に大きな差があり、どうしても遅くなってしまいます。
ただ、原因が明確だと納得もでき、管理しやすいのではないでしょうか。

投稿2020/08/18 10:08

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h451

2020/08/19 04:21

ご回答いただきありがとうございます。 やはり貧弱なramがあやしそうですか... 教えていただいたところを重点的に調べていきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問