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

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文件中做出修改,分三步:
 
1、增長 handler["/xxx"] = xxx;
 
2、增長 function xxx(request, response){...};
 
3、增長 exports.xxx = xxx;
相關文章
相關標籤/搜索