2016-11-05 6 views
1

問題:ノードパッケージ 'formidable'の.parse()メソッドは実行したくありません。formidable.parseメソッドが実行されていない、nodejsおよびformidableパッケージ

Reasources:このサイトにコードスニペットことができますならば、私は参考のために使っていたものです:https://github.com/felixge/node-formidable

説明:を私はしてファイルをアップロードして保存することができるウェブサイトを作成しようとしていますサーバーサイドコードのnodejs。私はこれを、ユーザーに指示するためのhttpdispatcherパッケージとアップロードフォームの処理のための強力なパッケージを使用して実現しています。

いつも私のプログラムは、恐ろしいパッケージメソッドparse()が実行されるまで期待どおりに実行してから何もしないという問題に遭遇しています。ブラウザのタブがリロードしようとしていて、約5分後に「サーバーは何も返信していませんでした」という行にエラーが表示されます。私はノードからエラーを受け取りません。

明らかに、このコードは処理されたフォームデータのみをユーザーに返します。私は合理的だと思う限り、単純化しました。

コード:nodejs、(server.jsファイル):

var http = require('http'); 
console.log('http loaded'); 
var fs = require('fs'); 
console.log('fs loaded'); 
var dispatcher = require('httpdispatcher'); 
console.log('dispatcher loaded'); 

var formidable = require('formidable'); 
console.log('formidable loaded'); 
var util = require('util'); 
console.log('util loaded'); 

dispatcher.setStaticDirname('.'); 
dispatcher.setStatic('resources'); 
dispatcher.onGet('/main', function(request, response){ 
    response.writeHead(200, {'Content-Type': 'text/html'}); 
    fs.readFile('index.html', function(error, html){ 
     response.end(html); //Callbacked to prevent async send of file read 
    }) 
}); 
dispatcher.onPost('/main', function(request, response){ 
    console.log('upload url accessed'); 
    processForm(request, response); 
}); 

const PORT = 8000; 

function processForm(request, response){ 
    console.log('processForm launched'); 
    var form = new formidable.IncomingForm(); 
    console.log('formidable initailised'); 
    form.parse(request, function(error, fields, files){ 
     console.log('form parsing started'); 
     response.writeHead(200, {'content-type': 'text/plain'}); 
     console.log('head written'); 
     response.write('data recieved:\n\n'); 
     response.end(util.inspect({fields: fields, files: files})); 
     console.log('form passing ended'); 
    }); 
} 
function saveImage(){ 
    console.log('saveImage called'); 
    fs.readFile(request.files.uploadImage.path, function(error, imageData){ 
     console.log('reading file'); 
     path = './uploadedImages'; 
     fs.writeFile(path, imageData, function(error){ 
      console.log('fs encountered an error: %s', error); 
     }); 
    }); 
    console.log('saveImage ended'); 
} 
function handleRequest(request, response){ 
    console.log('request handler started'); 
    console.log('request method: %s', request.method); 
    try{ 
     console.log(`URL: %s was requested`, request.url); 
     dispatcher.dispatch(request, response); 
    } 
    catch(error){ 
     console.log(`httpdispatcher encountered an error: %s`, error); 
    } 
    console.log('request handler ended'); 
} 

var server = http.createServer(handleRequest); 
server.listen(PORT, function(){ 
    //Callback triggered when server is successfully listening. 
    console.log("Server listening on: http://localhost:%s", PORT); 
}); 

コード:HTML、(index.htmlファイル):

<!DOCTYPE html> 
<html> 
<head></head> 
<body> 
    <form action="" method="post" enctype="multipart/form-data"> 
     <input type="file" name="uploadImage"> 
    </form> 
    <form action="" enctype="multipart/form-data" method="post"> 
     <fieldset> 
      <label for="imageTitle">Image title:</label> 
      <input type="text" id="imageTitle" name="imageTitle" placeholder="Enter title of image" /> 
      <br /> 
      <label for="imageDesription">Image desription:</label> 
      <textarea id="imageDesription" name="imageDesription" placeholder="Enter a description of the image"></textarea> 
      <br /> 
      <input type="submit" value="Upload Image" /> 
     </fieldset> 
     </form> 
</body> 
</html> 

は、事前にありがとうございます。

+0

フォームのアクションは 'action ="/upload "'のようにしてはいけませんか? –

+0

@Amirわかりませんが、違うページにリダイレクトされませんか?それは私がやるべきことですか? –

+0

'/ upload'でフォームデータを扱っているので、フォームはそこを指しているはずです。あるいは '/ main'でフォームを扱うこともできます。しかし、それは問題ではありません。 –

答えて

1

httpdispatcherrequestバッファを変更します。そのため、formidableはフォームの値を抽出できません。これをテストする

、あなたはリクエストをディスパッチせずに、直接、HTTPモジュールのコールバック内のPOSTリクエストを処理することができます

function handleRequest(request, response){ 
    console.log('request handler started'); 
    console.log('request method: %s', request.method); 

    // HERE 
    if (request.method == 'POST') { 
     processForm(request, response); 
     return; 
    } 

    try{ 
     console.log(`URL: %s was requested`, request.url); 
     dispatcher.dispatch(request, response); 
    } 
    catch(error){ 
     console.log(`httpdispatcher encountered an error: %s`, error); 
    } 
    console.log('request handler ended'); 
} 

を私はあなたが方法や経路に基づいて、要求をディスパッチするためにexpressを使用することをお勧めします。

+0

ありがとうございます。私はこれを働かせようとします。とにかくこの時点でExpressはより良い選択肢のように思えます。 –

+0

幸運を助けてくれることを願います。 –

関連する問題