Node.js基礎9:web服務器2---處理 GET 或 POST 請求發送的數據

處理 GET 或 POST 請求發送的數據

處理GET請求

server中的 request.url會把查詢字符串也帶過來
在這裏插入圖片描述
解決方法:
在這裏插入圖片描述
使用url庫解析,
這樣pathname就是查詢字符串前面的字符串,
url庫可以對url進行一些處理,可以取一些主機名,協議之類的數據

例如我們接下來將查詢字符串解析爲鍵值對的形式:

server.js
在這裏插入圖片描述將解析過後的params一層層傳到handle裏,然後處理
在這裏插入圖片描述
交給/api/v1/records 這條路來處理:直接將這個json字符串轉化爲對象相應給前端
在這裏插入圖片描述
結果:在這裏插入圖片描述
在這裏插入圖片描述
var params = url.parse(request.url, true).query;true這個參數代表返回一個JSON對象形式的字符串(本質上是一個字符串),如果是false,就直接返回完整的查詢字符串:如下
在這裏插入圖片描述

處理POST

在index.html建一個簡單的表單發送post請求先進入index.html,再通過表單進入

<form action="/api/v1/records" method="post">
        name: <input type="text" name="name" /> age: <input type="text" name="age" />
        <input type="submit" value="Submit">
    </form>

注意:url庫只能解析get發送的請求
修改代碼:

var http = require('http');
var fs = require('fs');
var url = require("url")
var querystring = require("querystring")//querystring用來將post請求中的數據解析爲對象
function startServer(route, handle) {
    var onRequest = function(request, response) {
        var pathname = url.parse(request.url).pathname
        console.log('Request received ' + pathname);
        var data = ''
        request.on('error',function(err){
            console.error(err)
        }).on('data',function(chunk){
            data+=chunk
        }).on('end',function(){
            if(request.method === "POST") {//如果是post請求,就這樣處理,還是那傳過來的數據都轉化爲對象,再丟給handle
                route(handle, pathname, response, querystring.parse(data));//這裏將post請求發送來的數據解析爲json對象的形式
            }else if(request.method === "GET"){//如果是get請求
                var params = url.parse(request.url, true).query;//轉化爲一個json對象(本質上是對象)
                route(handle, pathname, response, params);//拿到查詢字符串
            }
        })
    }

    var server = http.createServer(onRequest);

    server.listen(3000, '127.0.0.1');
    console.log('Server started on localhost port 3000');
}

module.exports.startServer = startServer;

在這裏插入圖片描述
在這裏插入圖片描述
post和get請求都ok
在這裏插入圖片描述

優化一下程序:

var http = require('http');
var fs = require('fs');
var url = require('url');
var querystring = require('querystring');

function startServer(route, handle) {
    var onRequest = function(request, response) {
        var pathname = url.parse(request.url).pathname;
        console.log('Request received ' + pathname);
        var data = [];//將data聲明爲數組,
        request.on("error", function(err) {
            console.error(err);
        }).on("data", function(chunk) {
            data.push(chunk);//
        }).on('end', function() {
            if (request.method === "POST") {
                if (data.length > 1e6) {//判斷長度,及時取消響應
                    request.connection.destroy();
                }
                data = Buffer.concat(data).toString();//使用流
                route(handle, pathname, response, querystring.parse(data));
            } else {
                var params = url.parse(request.url, true).query;
                route(handle, pathname, response, params);
            }
        });
    }

if (data.length > 1e6)科學計數法,如果數據量很大,就把請求取消,不然會增加服務器的負載,使服務器宕機

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