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

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

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

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

Express

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

Q&A

解決済

1回答

2600閲覧

NodeJSを使用してEC2からS3へのアップロードが失敗します。

MineoOkuda

総合スコア89

Node.js

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

Express

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

0グッド

2クリップ

投稿2015/09/14 09:33

flow.js
fow.jsを使用してupload処理を書き、サーバーサイドはNodeJS+Express4.0にてアップロード完了後にStreamでファイルをひとまとめにし、S3へのアップロード処理をしています。
Node.js側の処理はほとんどサンプルと同じです。
flow.js のNodeJSサンプル

javascript

1var fs = require('fs'); 2var flow = require('./node-flow.js')('tmp'); 3..... 4app.get('/api/upload/', function (req, res) { 5 flow.get(req, function(status, filename, original_filename, identifier) { 6 7 if (status == 'found') { 8 status = 200; 9 } else { 10 status = 204; 11 } 12 res.status(status).send(); 13 }); 14}); 15app.post('/api/upload/', function (req, res) { 16 flow.post(req, function(status, filename, original_filename, identifier) { 17 if(status==='done'){ 18 var s = fs.createWriteStream('public/upload/' + req.files.file.name); 19 s.on('finish', function() { 20 flow.clean(identifier); 21 }); 22 23 flow.write(identifier, s, {end: true, 24 onDone : function(){ 25 //S3へのアップロード処理 26 upload(req,res); 27 } 28 }); 29 }else{ 30 res.status(status).send(); 31 } 32 }); 33 }); 34....

この仕様でローカルではうまく動くのですが、EC2では数十メガほどの大きめのファイルをアップロードすると
「net::ERR_CONNECTION_REFUSED」と出て、ajaxのPOST接続が途中で止まってしまいます。(小さいファイルであれば問題ありません。)
原因がわかる方はいらっしゃらないでしょうか・・・。

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

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

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

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

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

guest

回答1

0

ベストアンサー

小さいファイルであれば成功するけど数十MBほどであれば失敗する、ということになるとコードの問題ではなくてEC2やS3周りの設定かなという気がします
EC2とS3間でタイムアウトしてるとかないですかね

投稿2015/09/15 08:34

khirose

総合スコア251

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

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

MineoOkuda

2015/09/16 04:28

解決いたしました。 はじめはmultipartの指定にmulterを使用していたんですが、multerではapp.use(multer())で指定するだけでuploadされてしまうという仕様のようで、2重でアップロードが走っていたのが原因だったようです。(この辺りがよく理解できていませんでした。) connect-multipartyのミドルウェアにすることで解決しました。 multerとconnect-multipartyではres.filesのオブジェクトに差異が生じていたので少し修正が必要でしたが何とか解決いたしました。 khirose様には回答依頼にて、親切に対応していただきましたのでベストアンサーとして解決済みにさせていただきます。 ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問