2012-01-06 21 views
2

以下のコードを使用して、ファイルをアップロードしようとすると、ブラウザは永久に読み込みを続けます。どんな考え?node.jsでファイルをアップロード中にエラーが発生しました

app.js

var formidable = require('formidable'), 
    http = require('http'), 
    util = require('util'); 

app.get('/song/add', function (req, res) { 
    res.writeHead(200, {'content-type': 'text/html'}); 
    res.end(
     '<form action="/song/upload" enctype="multipart/form-data" method="post">'+ 
     '<input type="text" name="title"><br>'+ 
     '<input type="file" name="upload" multiple="multiple"><br>'+ 
     '<input type="submit" value="Upload">'+ 
     '</form>' 
    ); 
}); 

app.post('/song/upload', function (req, res) { 
    var form = new formidable.IncomingForm(); 
    form.parse(req, function (err, fields, files) { 
     res.writeHead(200, {'content-type': 'text/plain'}); 
     res.write('received upload:\n\n'); 
     res.end(util.inspect({fields: fields, files: files})); 
    }); 
    return; 
}); 

答えて

1

コード内でその行(app.use(express.bodyParser()))を削除するだけで、それはうまくいくはずです。

しかし、なぜあなたは恐ろしいものを使いたいのですか?明示的なボディパーサは強力で、それはよりクリーンな使用に基づいていると私は信じています。 JSONのようなフォームタイプの横にある他のタイプのボディも解析するので、ボディタイプがサポートされていないと、formidableはエラーをスローします。あなたのコードでapp.use(express.bodyParser())を持っている場合は、あなたが望む結果を得るためにこれを行うことができます:私がここに何を参照してください

app.post('/song/upload', function(req, res){ 
    res.writeHead(200, {'content-type': 'text/plain'}); 
    res.write('received upload:\n\n'); 
    res.end(util.inspect(req.body)); 
    return; 
}); 
+0

実行しています。ありがとうございます –

1

おそらく急行ボディパーサのオプションがオンになっています。以下のようなもののためにあなたの設定を確認してください:

app.use(express.bodyParser()) 

私はこの問題は、強敵がこのファイル&ためのストリームイベントを期待している彼らはすでにあなたのapp.postコールバックが呼び出された時点でExpressで消費されてきたということだと思います。 form.parseコールバックはendでのみ起動されるため、応答はこれまでにレンダリングされません。

解決策は、ExpressまたはFormidableを使用することです。Formidableを使用する場合は、configオプションを無効にすることができます。

+0

私のコードで 'app.use(express.bodyParser())'を有効にしました。Formidable **を使用したい場合は**設定オプションを無効にしてください** –

+0

あなたは** [connect-form](https://github.com)を使うことができます。/visionmedia/connect-form)**しかし、このモジュールは著者によれば非難されています[フォーム処理 - Express.jsでの処理](http://www.hacksparrow.com/form-handling-processing- in-express-js.html) –

+0

[Express(Node.js)のファイルの処理](http://www.hacksparrow.com/handle-file-uploads-in-express)を参照してください。 -node-js.html)これも上記の記事の続編です。 –

0

問題は(接続1.8.0以降)新しいボディパーサーです。あなたは手ごわいとの新しい接続を使用する場合は、本体パーサからマルチパートパーサを削除する必要があります。

delete express.bodyParser.parse['multipart/form-data']; 
+1

私はこの李を追加しようとするとそれは私のアプリをクラッシュするコードのNE - 私は得る: /コード/ myApp /サーバー/メイン.js:6 削除express.bodyParser。['multipart/form-data']を解析します。 ^ TypeError:nullをオブジェクトのオブジェクト に変換できません。 (/Code/myApp/server/main.js:6:26) at Module._compile(module.js:446:26) at Object..js(module.js:464:10) at Module。モジュール(module.js:359:17) Function._load(module.js:311:12) at Module.require(module.js:359:17) at require(module.js:375:17) など – Myk

0

エクスプレス4.xのでbodyParserを使用しないでください: http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html

使用

app.use(express.json());

app.use(express.urlencoded());

代わりに

コードの問題は、結果がユーザーに送信されないようにコールバックが呼び出される前に戻ります。

にコードを変更し

return res.end(util.inspect({fields: fields, files: files}));

、最後にリターンを削除します。

関連する問題