標籤:
-
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