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;
下面的內容你可能也喜歡:
如何在CentOS 7安裝Node.js http://www.linuxidc.com/Linux/2015-02/113554.htm
Ubuntu 14.04下搭建Node.js開發環境 http://www.linuxidc.com/Linux/2014-12/110983.htm
Ubunru 12.04 下Node.js開發環境的安裝配置 http://www.linuxidc.com/Linux/2014-05/101418.htm
Node.Js入門[PDF+相關代碼] http://www.linuxidc.com/Linux/2013-06/85462.htm
Node.js開發指南 高清PDF中文版 +源碼 http://www.linuxidc.com/Linux/2014-09/106494.htm
Node.js入門開發指南中文版 http://www.linuxidc.com/Linux/2012-11/73363.htm
Ubuntu 編譯安裝Node.js http://www.linuxidc.com/Linux/2013-10/91321.htm
Node.js 的詳細介紹:請點這裡
Node.js 的下載地址:請點這裡