自學Node.js 四:處理post數據

   

      作爲普通的web開發,通常都會涉及到post/get方式來請求server,接下來我們要用Node.js來實現一個上傳圖片並瀏覽的功能,所以要先解決post數據的處理問題。


    在html頁面中,創建一個form標籤,action爲/upload(或其他你喜歡的名稱),method設爲post,如下:
<form action="/upload" method="post"><textarea name="text" rows="20" cols="50"></textarea><inputtype="submit" value="上傳" /></form>

    那代碼該怎麼改呢?除了會在html中寫一個簡單的post form,還需要知道在Node.js中如何處理request請求,因爲post數據就是存在於request中。其中,request對象提供的addListener有關於非阻塞請求(以後慢慢介紹)的處理方式。

     “這裏採用非阻塞方式處理是明智的,因爲POST請求一般都比較“重” —— 用戶可能會輸入大量的內容。用阻塞的方式處理大數據量的請求必然會導致用戶操作的阻塞。爲了使整個過程非阻塞,Node.js會將POST數據拆分成很多小的數據塊,然後通過觸發特定的事件,將這些小數據塊傳遞給回調函數。這裏的特定的事件有data事件(表示新的小數據塊到達了)以及end事件(表示所有的數據都已經接收完畢)。”

     addListener = function(type, listener),其中type爲data和end的時候都會回調function listerer。這樣的話,我們就要把對request的事件監聽,放到server模塊中,當接收完所有數據,觸發end事件,讓其回調函數調用route模塊進行處理即可。

    先修改Server.js文件,增加對request的事件監聽:
var http = require("http");
var url = require("url");

function start(route,handle) {
    function   onRequest(request,response)  {
        var postData = "";
        var pathname = url.parse(request.url).pathname;
//        console.log("Request for "+pathname+" received.") ;

        //設置request請求的數據編碼。
        request.setEncoding("utf8");
        request.addListener("data",function(data){
            postData  += data;
            console.log("Received POST data :")+data ;
        });
        request.addListener("end",function(){
            route(handle,pathname,response,postData);
        })
    }

    http.createServer(onRequest).listen(8888);
    console.log("Server has  started");
}

exports.start = start;

   在requestHandlers.js文件中完善start()函數,當請求/start時,頁面要渲染出一個簡單的submit頁面。
var querystring = require("querystring") ;

function start(response,postData){
    var body = '<html>'+
        '<head>'+
        '<meta http-equiv="Content-Type" content="text/html; '+
        'charset=UTF-8" />'+
        '</head>'+
        '<body>'+
        '<form action="/upload" method="post">'+
        '<textarea name="text" rows="20" cols="60"></textarea>'+
        '<input type="submit" value="Submit" />'+
        '</form>'+
        '</body>'+
        '</html>';

    response.writeHead(200,{"Content-Type":"text/html"});
    response.write(body) ;
    response.end();
    return ("Request handler 'start' was called.");
}

function upload(response, postData){
    response.writeHead(200,{"Content-Type":"text/plain"});
    //這裏會把post的數據,寫到html頁面上。
    response.write("Upload the postData: "+
        querystring.parse(postData).text);
    response.end();
    return ("Request handler 'upload' was called.");
}

exports.start = start;
exports.upload = upload;


     還有,根據上面兩處代碼的修改,不要忘記 給route模塊的route方法增加postData參數。對於404(statusCode)的處理,IE下會默認顯示自己的404頁面,chrome瀏覽器,會顯示write上去的數據。
    
   啓動WebStorm,可以通過斷點方式,看一下這個簡單的post處理流程。結果如下截圖:




    很容易想到,如果我們把textarea換做一個類upload標籤(formidable),就可以完成圖片上傳的功能.這部分功能,接下來會做一種實現。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章