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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

1942閲覧

node.js express で multipart/formdataを受け取り、別サーバーへ送った1分後に通信が切れる

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/09/01 08:36

編集2020/09/01 08:53

expressのapiサーバーでクライアントからmultipart/formdataを受け取りmulterモジュールを用いて一度ディスクへストレージしたファイルたちを再度別のサーバーに送る際に、きっちり1分後(別のサーバーへpost requestを送った直後から数えて)webサーバー側で下記のエラーが発生します。送り先のサーバーではエラーは起きず、streamを待っている状態でストップします。
streamを送っているのですが、1分たつまではちゃんとチャンクが届いております。

webサーバー、apiサーバーはローカル環境(windows 10 pc)にてたてております。
送り先の別サーバーはレンタルサーバー(linux centos7)です。

色々と試しましたが、なにが原因かつかめません。
また、webサーバー、apiサーバーもレンタルサーバーでたてて本番環境でも試しましたが、webサーバー側でエラーはでないものの同様に1分で接続が切れてしまいます。(ブラウザでは
Error: Network Error
at t.exports (app.1587455.js:2)
at XMLHttpRequest._.onerror (app.1587455.js:2)
Failed to load resource: net::ERR_CONNECTION_RESET
というエラーが出ます。
)
毎回1分でエラーが出るので何かしらのタイムアウトなのかなと思っておりますが、
どなたか詳しい方、なにか原因の候補として考えられることはありますでしょうか。
ご教授よろしくお願いいたします。

error

1Unhandled rejection RequestError: Error: socket hang up 2 at new RequestError (E:\hiroki\works\NUXT\h_html\node_modules\request-promise-core\lib\errors.js:14:15) 3 at Request.plumbing.callback (E:\hiroki\works\NUXT\h_html\node_modules\request-promise-core\lib\plumbing.js:87:29) 4 at Request.RP$callback [as _callback] (E:\hiroki\works\NUXT\h_html\node_modules\request-promise-core\lib\plumbing.js:46:31) 5 at self.callback (E:\hiroki\works\NUXT\h_html\node_modules\request\request.js:185:22) 6 at Request.emit (events.js:327:22) 7 at Request.EventEmitter.emit (domain.js:482:12) 8 at Request.onRequestError (E:\hiroki\works\NUXT\h_html\node_modules\request\request.js:877:8) 9 at ClientRequest.emit (events.js:315:20) 10 at ClientRequest.EventEmitter.emit (domain.js:482:12) 11 at Socket.socketOnEnd (_http_client.js:453:9) 12 at Socket.emit (events.js:327:22) 13 at Socket.EventEmitter.emit (domain.js:482:12) 14 at endReadableNT (_stream_readable.js:1221:12) 15 at processTicksAndRejections (internal/process/task_queues.js:84:21) 16From previous event: 17 at Request.plumbing.init (E:\hiroki\works\NUXT\h_html\node_modules\request-promise-core\lib\plumbing.js:36:28) 18 at Request.RP$initInterceptor [as init] (E:\hiroki\works\NUXT\h_html\node_modules\request-promise-core\configure\request2.js:41:27) 19 at new Request (E:\hiroki\works\NUXT\h_html\node_modules\request\request.js:127:8) 20 at request (E:\hiroki\works\NUXT\h_html\node_modules\request\index.js:53:10) 21 at E:\hiroki\works\NUXT\h_html\server\file.js:105:5 22 at Immediate.<anonymous> (E:\hiroki\works\NUXT\h_html\node_modules\multer\lib\make-middleware.js:53:37) 23 at processImmediate (internal/timers.js:458:21) 24 at process.topLevelDomainCallback (domain.js:137:15)

クライアントから送られてきたファイル達を読み込みstreamをwebサーバーから別のレンタルサーバーに送る

javascript

1var allfiles = []; 2 fileNameStore.forEach((value) => { 3 allfiles.push(fs.createReadStream(`./${folderName}/${value}`)) 4 }) 5 6 let data = JSON.parse(req.body.data) 7 var formData = { 8 "data": req.body.data, 9 "file": allfiles, 10 } 11 12 var options = { 13 url: `${process.env.DB_API}/uploadGame`, 14 method: "POST", 15 formData: formData, 16 headers: { 17 "Content-Type": "multipart/form-data" 18 } 19 } 20 21 console.log("Just before request") 22 requestPromise(options) 23 .then(function (body) { 24 fileNameStore.forEach((value) => { 25 fs.unlink(`./${folderName}/` + value, function (err) { 26 }); 27 }) 28 console.log("Game send done") 29 res.send("Fin") 30 }) 31 .catch(function (err) { 32 fileNameStore.forEach((value) => { 33 fs.unlink(`./${folderName}/` + value, function (err) { 34 }); 35 }) 36 throw (err) //←ここのエラー 37 });

streamをレンタルサーバーで受け取る

javascript

1app.post("/uploadGame", (req, res, err) => { 2 var busboy = new Busboy({ headers: req.headers }); 3 var txtdata 4 var totalsize = 0 5 console.log("1") 6 7 busboy.on('field', (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) => { 8 console.log("2") 9 txtdata = JSON.parse(val) 10 console.log(txtdata) 11 }); 12 busboy.on('file', (fieldname, file, filename, encoding, mimetype) => { 13 console.log("3") 14 file.on('data', function (data) { 15 console.log(data) 16 totalsize += data.length 17 console.log(totalsize) 18 }); 19 file.on('end', function () { 20 console.log("file end") 21 }); 22 23 24 var thisPath = txtdata.file_paths.filter(function (v, index) { 25 if (v.name == filename) return true; 26 })[0].path 27 let savePath = "./games/" + String(txtdata.game_id) + "/build/" + getRidOf(thisPath); 28 let makePath = "games/" + String(txtdata.game_id) + "/build/" + getRidOf(thisPath) + "/" 29 // .then(() => { 30 fs.mkdirsSync(makePath) 31 file.pipe(fs.createWriteStream(savePath + "/" + filename.split(".Date_Now0721.")[1])) 32 33 }); 34 busboy.on('finish', function () { 35 console.log("fin") 36 res.writeHead(200, { 'Connection': 'close' }); 37 res.end("That's all folks!"); 38 }); 39 return req.pipe(busboy); 40});

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

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

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

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

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

dameo

2020/09/02 11:25

uploadがデカすぎ長すぎとかそういうことでは? とりあえずレンタルサーバーの運営に聞きましょう
h451

2020/09/03 01:35

聞いてみましたが、「会社としてはお使いのサーバーにpingで接続確認できているのであとのサーバーのカスタマイズはお客様しだいです。」というような感じで返事が帰ってきました。 レンタルサーバーの会社がセキュリティ設定かなにかをしていて、貸しているvpsサーバーへのpostリクエストが長いと通信を切っているというようなことは通常あり得るのでしょうか?
h451

2020/09/03 01:39

すいません、vpsサーバーの根本的な仕組みが分かっておらず 僕のイメージとしてはvpsサーバーを包括するサーバーのセキュリティ設定かなにかによって子であるレンタルvpsサーバーの通信が切断されているのかなと考えているのですが。
dameo

2020/09/03 01:44

よくある言葉の使い方として、レンタルサーバーというのは、VPSを指さない、共有サーバーのことだと思っていました。VPSだったんですね。それだと管理会社は関係ない可能性が高いですね。uploadを受けている側のサーバーはexpressですか? 環境、バージョンなどを詳しくお書きください。 またそのサーバーでのエラーメッセージがあればそれも貼ってください。
h451

2020/09/03 01:46

ちなみに、ほかの会社のレンタルサーバーも借りており、そちらで同じos、その他構築でpostリクエストを送ったところ何分たっても切断されずに最後まで送り切ることができました。 そのため、この1分後の切断現象はレンタルサーバー会社側の外部的要因ではないかと考えました。
dameo

2020/09/03 01:48

そうなんですね。いずれにしても受けてる側がどういうメッセージを出しているか次第かと思います。
h451

2020/09/03 02:00

何度も返信いただきありがとうございます。 os は linux centos7 7.8.2003でnode.js の express: 4.17.1 でmulterというモジュールを使って受けております。 ブラウザ側からファイルをpostした時、express側でエラーは出ず、multerがストリームをパースしている途中で止まっているようです。 1分後、通信が切れたのかブラウザ側で再度postが実行されmulterは同じstreamをパースします。 しかしまたもや1分で接続が切れ、二回連続で切れたためかブラウザ側はpostを送りなおさす、 Error: Network Error at t.exports (app.1587455.js:2) at XMLHttpRequest._.onerror (app.1587455.js:2) Failed to load resource: net::ERR_CONNECTION_RESET というエラーを表示させます。 この時express,multer側ではなんのエラーも出ていません。streamが途中で止まったような挙動です。
dameo

2020/09/03 02:07

まだmulterは待ってる感じだということですね。。。 状況を管理会社のサポート窓口に伝えて、ネットワーク的な制約がないか確認した方がいいかもです。 クライアント側ではRESETを検出していて、サーバー側がまだ待ってるということは途中でぶち切られた可能性が高いと思います。それでもダメだともっと簡単な証拠を用意して問い詰めるか、別のサービスを使うかかと思います。
h451

2020/09/03 02:12

ありがとうございますm(-_-)m 海外のvpsサーバーを借りており、問い詰めるのが難しそうなので別のサービスを使って試してみようと思います。 長くお付き合いいただきありがとうございました。大変たすかりました。
guest

回答1

0

自己解決

外部的要因により通信が切断された可能性が高いので、別のレンタルサーバーサービスを使いたいと思います。
Dameo様、ご意見ありがとうございました。

投稿2020/09/03 02:15

h451

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問