NodeJS系列~第一個小例子,實現了request.querystring功能

返回目錄html

百度百科上:

Node.js是一套用來編寫高性能網絡服務器的JavaScript工具包,一系列的變化由此開始,在Node中,Http是首要的。Node爲建立http服務器做了優化,因此在網上看到的大部分示例和庫都是集中在web上(http框架、模板庫等)。node

Node.js的優勢

nodejs做爲一個新興的後臺語言,有不少吸引人的地方:
RESTful API
單線程
Node.js能夠在不新增額外線程的狀況下,依然能夠對任務進行並行處理 —— Node.js是單線程的。它經過事件輪詢(event loop)來實現並行操做,對此,咱們應該要充分利用這一點 —— 儘量的避免阻塞操做,取而代之,多使用非阻塞操做。
非阻塞IO
事件驅動

下面我愉前人寫的一個資料,讓你們更清楚的瞭解NodeJS,前人的文章

 Node 旨在解決什麼問題?

Node 公開宣稱的目標是 「旨在提供一種簡單的構建可伸縮網絡程序的方法」。當前的服務器程序有什麼問題?咱們來作個數學題。在 Java™ 和 PHP 這類語言中,每一個鏈接都會生成一個新線程,每一個新線程可能須要 2 MB 的配套內存。在一個擁有 8 GB RAM 的系統上,理論上最大的併發鏈接數量是 4,000 個用戶。隨着您的客戶羣的增加,若是但願您的 Web 應用程序支持更多用戶,那麼,您必須添加更多服務器。固然,這會增長服務器成本、流量成本和人工成本等成本。除這些成本上升外,還有一個潛在技術問題,即 用戶可能針對每一個請求使用不一樣的服務器,所以,任何共享資源都必須在全部服務器之間共享。鑑於上述全部緣由,整個 Web 應用程序架構(包括流量、處理器速度和內存速度)中的瓶頸是:服務器可以處理的併發鏈接的最大數量。程序員

Node 解決這個問題的方法是:更改鏈接到服務器的方式。每一個鏈接發射一個在 Node 引擎的進程中運行的事件,而不是爲每一個鏈接生成一個新的 OS 線程(併爲其分配一些配套內存)。Node 聲稱它毫不會死鎖,由於它根本不容許使用鎖,它不會直接阻塞 I/O 調用。Node 還宣稱,運行它的服務器能支持數萬個併發鏈接。web

如今您有了一個能處理數萬個併發鏈接的程序,那麼您能經過 Node 實際構建什麼呢?若是您有一個 Web 應用程序須要處理這麼多鏈接,那將是一件很 「恐怖」 的事!那是一種 「若是您有這個問題,那麼它根本不是問題」 的問題。在回答上面的問題以前,咱們先看看 Node 的工做原理以及它的設計運行方式。編程

Node 確定不是什麼?

沒錯,Node 是一個服務器程序。可是,基礎 Node 產品確定 像 Apache 或 Tomcat。本質上,那些服務器 「安裝就緒型」 服 務器產品,支持當即部署應用程序。經過這些產品,您能夠在一分鐘內啓動並運行一個服務器。Node 確定不是這種產品。Apache 能經過添加一個 PHP 模塊來容許開發人員建立動態 Web 頁,添加一個 SSL 模塊來實現安全鏈接,與此相似,Node 也有模塊概念,容許向 Node 內核添加模塊。實際上,可供選擇的用於 Node 的模塊有數百個之多,社區在建立、發佈和更新模塊方面很是活躍,一天甚至能夠處理數十個模塊。本文後面將討論 Node 的整個模塊部分。瀏覽器

Node 如何工做?

Node 自己運行 V8 JavaScript。等等,服務器上的 JavaScript?沒錯,您沒有看錯。對於只在客戶機上使用 JavaScript 的程序員而言,服務器端 JavaScript 多是一個新概念,但這個概念自己並不是高不可攀,所以爲什麼不能在服務器上使用客戶機上使用的編程語言?緩存

什麼是 V8?V8 JavaScript 引擎是 Google 用於其 Chrome 瀏覽器的底層 JavaScript 引擎。不多有人考慮 JavaScript 在客戶機上實際作了些什麼?實際上,JavaScript 引擎負責解釋並執行代碼。Google 使用 V8 建立了一個用 C++ 編寫的超快解釋器,該解釋器擁有另外一個獨特特徵;您能夠下載該引擎並將其嵌入任何 應用程序。V8 JavaScript 引擎並不只限於在一個瀏覽器中運行。所以,Node 實際上會使用 Google 編寫的 V8 JavaScript 引擎,並將其重建爲可在服務器上使用。太完美了!既然已經有一個不錯的解決方案可用,爲什麼還要建立一種新語言呢?安全

事件驅動編程

許多程序員接受的教育使他們認爲,面向對象編程是完美的編程設計,這使得他們對其餘編程方法不屑一顧。Node 使用了一個所謂的事件驅動編程模型。服務器

清單 1. 客戶端上使用 jQuery 的事件驅動編程
// jQuery code on the client-side showing how Event-Driven programming works

// When a button is pressed, an Event occurs - deal with it
// directly right here in an anonymous function, where all the
// necessary variables are present and can be referenced directly
$("#myButton").click(function(){
     if ($("#myTextField").val() != $(this).val())
         alert("Field must match button text");
});

實際上,服務器端和客戶端沒有任何區別。沒錯,這沒有按鈕點擊操做,也沒有向文本字段鍵入的操做,但在一個更高的層面上,事件正在 發生。一個鏈接被創建,這是一個事件!數據經過鏈接進行接收,這也是一個事件!數據經過鏈接中止,這仍是一個事件!網絡

爲 什麼這種設置類型對 Node 很理想?JavaScript 是一種很棒的事件驅動編程語言,由於它容許使用匿名函數和閉包,更重要的是,任何寫過代碼的人都熟悉它的語法。事件發生時調用的回調函數能夠在捕獲事件處 進行編寫。這樣可使代碼容易編寫和維護,沒有複雜的面向對象框架,沒有接口,沒有過分設計的可能性。只需監聽事件,編寫一個回調函數,其餘事情均可以交 給系統處理!

擴展的模塊

Node.js使用Module模塊去劃分不一樣的功能,以簡化應用的開發。Modules模塊有點象C語言中的類 庫。每個Node.js的類庫都包含了十分豐富的各種函數,好比http模塊就包含了和http功能相關的不少函數,能夠幫助開發者很容易地對好比 http,tcp/udp等進行操做,還能夠很容易的建立http和tcp/udp的服務器。
要在程序中使用模塊是十分方便的,只須要以下:
在這裏,引入了http類庫,而且對http類庫的引用存放在http變量中了。這個時候,node.js會在咱們 應用中搜索是否存在node_modules的目錄,而且搜索這個目錄中是否存在http的模塊。若是node.js找不到這個目錄,則會到全局模塊緩存 中去尋找,用戶能夠經過相對或者絕對路徑,指定模塊的位置,好比:
var myModule = require('./myModule.js');

模塊中包含了不少功能代碼片段,在模塊中的代碼大部分都是私有的,意思是在模塊中定義的函數方法和變量,都只能在同一個模塊中被調用。固然,能夠將某些方法和變量暴露到模塊外,這個時候可使用export對象去實現

首先須要安裝nodejs環境,相關文件下載

下載以後,安裝以後,在C盤就會出現nodejs的相關目錄

OK,咱們來看一下如何實現request.querystring功能的,即get請求的功能,相關代碼以下:

var qs = require('querystring');
var http = require('http');
var formidable = require('formidable');
var exec = require('child_process').exec;
var fs = require('fs');
var filename = '';

var url = require("url");

function start(response, request) {
    var getQuery = url.parse(request.url).query;
    var getData = qs.parse(getQuery); //getData數據 
    console.log(getData["zzl"]);
}

別外一種比較標準的寫法重到querystring字符串,寫法以下:

var http = require("http");
var url = require("url");
var params = url.parse(request.url, true).query;
console.log(params.zzl);

感受第二種寫法更清晰

測試:

http://127.0.0.1:8888?zzl=1234

對於nodejs的console控制檯的結果就爲:

 返回目錄

相關文章
相關標籤/搜索