formidable.parse方法不执行,nodejs和强大的包

问题:节点包“formidable”中的.parse()方法不想执行。

Reasources:这个网站上的代码片段是我用作参考,如果有帮助: https : //github.com/felixge/node-formidable

描述:我正在尝试创build一个网站,可以上传和存储一个带有nodejs文件的服务器端代码。 我正在实现这个使用httpdispatcher包引导用户,并强大的包处理上传表单。

我遇到一个问题,每次我的程序都按照预期执行,直到强大的包方法parsing(),然后停止任何操作。 浏览器选项卡试图重新加载,并且在差不多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> 

先谢谢你。

看起来像httpdispatcher修改request缓冲区,所以强大的不能从中提取表单值。

为了testing这个,你可以直接在http模块的callback中处理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'); } 

我build议你使用快递根据方法和路线发送请求。