node.js表單——formidable/////z

來源:互聯網
上載者:User

標籤:

node.js表單——formidable
 
node處理表單請求,需要用到formidable包。安裝formidable包的命令如下: npm install formidable 安裝package的路徑分為兩種,一種是本地目錄,一種是全域目錄。 npm install xxx -g 命令將模組下載安裝到全域目錄中。 全域目錄可以通過 npm config set prefix "目錄路徑" 來設定。 通過 npm config get prefix 來擷取當前設定的目錄。 npm install xxx ,則是將模組下載到當前命令列所在目錄。 關於package安裝路徑的說明網上是像上面那樣說的,但我不執行全域安裝的時候,formidable被安裝在了使用者主目錄/home/使用者名稱/node_modules下面,而不是安裝在命令列所在目錄,我用的ubuntu版本是14.04,原因不太清楚。安裝在本裡目錄和全域目錄到底哪個好,我認為各有優勢。這裡就不贅述了。 安裝完formidable之後,一個標準的node project,應該有一個index.js檔案,用於定義怎麼處理來自瀏覽器的request,index.js代碼如下:  
var http = require("http");//擷取http對象var url = require("url");//擷取url對象//http、url都是系統內建的模組,而下面的requestHandlers是我們手動編寫的模組,對應目前的目錄下的requestHandlers.js檔案var requestHandlers = require("./requestHandlers");//onRequest函數,用於處理http請求,不同的url請求交由不同的函數進行處理function onRequest(request, response){    var pathname = url.parse(request.url).pathname;//擷取請求的URL    //requestHandlers的handle屬性又是一個對象,該對象包含多組屬性:屬性值,屬性名稱對應uri,屬性值對應處理函數,詳見requestHandlers.js    if(typeof requestHandlers.handle[pathname] === "function")        requestHandlers.handle[pathname](request, response);    else {        console.log("No request handler found for " + pathname);        response.writeHead(404, {"Content-Type": "text/html;charset=utf-8"});        response.write("您訪問的頁面不存在!訪問<a href=‘/‘>首頁</a>");        response.end();    }}var server = http.createServer(onRequest);//函數onRequest作為createServer的參數,這樣瀏覽器每發送一次請求,伺服器中該函數都會被調用一次server.listen(8888);//上面兩句可以合寫成http.createServer(onRequest).listen(8888);

 

  上面這段代碼幾乎可以成為大部分node項目的index的模板,有改動也不會很大,如果給應用增加功能,只需要更改後面的requestHandlers.js檔案。以前上學時老師講的一個基本node應用分為index.js、server.js、router.js和requestHandlers.js四個部分,而server.js和router.js的代碼從來都是不需要改變的,可以應用到任何一個項目,後來我發現其實前三個部分可以整合到一起,於是自己琢磨了一下寫出了上面那個index.js,後來發現整合之後其實還好理解一點。 下面貼出requestHandlers.js的代碼:  
var handle = {};var formidable = require("formidable");handle["/"] = start;handle["/start"] = start;handle["/upload"] = upload;function start(request, response) {  var body = ‘<html>‘+    ‘<head>‘+    ‘<meta http-equiv="Content-Type" content="text/html; ‘+    ‘charset=UTF-8" />‘+    ‘</head>‘+    ‘<body>‘+    ‘<form action="/upload" method="post">‘+    ‘學號:<input type="text" name="id" /><br /><br />‘+    ‘姓名:<input type="text" name="name" /><br /><br />‘+    ‘<input type="submit" value="提交" />‘+    ‘</form>‘+    ‘</body>‘+    ‘</html>‘;    response.writeHead(200, {"Content-Type": "text/html"});    response.write(body);    response.end();}function upload(request, response) {    var form = new formidable.IncomingForm();    form.parse(request, function(error, fields, files) {    console.log("id:" + fields.id);    console.log("name:" + fields.name);    response.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});    response.write("id:" + fields.id + "<br>");    response.write("name:" + fields.name);    response.end();    });}exports.handle = handle;exports.start = start;exports.upload = upload;

 

  上面示範了一個form表單提交後,從form表單中提取資訊的例子。其中handle是一個對象,包含多組屬性和屬性值,屬性名稱對應url,屬性值對應處理函數,即請求的url與函數是一一對應的,瀏覽器每發送一個請求,伺服器分析出請求的url,並用handle中名為該url的屬性的值所對應的函數來處理該請求。比如,瀏覽器發送了一個請求,uri為/upload,伺服器尋找到handler中,handler["/upload"] = upload,就會調用upload函數來處理該請求。模組中所有可能會被外部檔案調用屬性、函數都需要使用exports命令匯出,如requestHandlers.js的結尾部分。所以,如果增加功能時,頁面上增加了一個連結或表單之類的請求/xxx,則通常需要在requestHandlers.js檔案中作出修改,分三步: 一、增加 handler["/xxx"] = xxx; 二、增加 function xxx(request, response){...}; 三、增加 exports.xxx = xxx; 

node.js表單——formidable/////z

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.