返回目錄html
Node.js是一套用來編寫高性能網絡服務器的JavaScript工具包,一系列的變化由此開始,在Node中,Http是首要的。Node爲建立http服務器做了優化,因此在網上看到的大部分示例和庫都是集中在web上(http框架、模板庫等)。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 產品確定不 像 Apache 或 Tomcat。本質上,那些服務器 「安裝就緒型」 服 務器產品,支持當即部署應用程序。經過這些產品,您能夠在一分鐘內啓動並運行一個服務器。Node 確定不是這種產品。Apache 能經過添加一個 PHP 模塊來容許開發人員建立動態 Web 頁,添加一個 SSL 模塊來實現安全鏈接,與此相似,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 使用了一個所謂的事件驅動編程模型。服務器
// 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 是一種很棒的事件驅動編程語言,由於它容許使用匿名函數和閉包,更重要的是,任何寫過代碼的人都熟悉它的語法。事件發生時調用的回調函數能夠在捕獲事件處 進行編寫。這樣可使代碼容易編寫和維護,沒有複雜的面向對象框架,沒有接口,沒有過分設計的可能性。只需監聽事件,編寫一個回調函數,其餘事情均可以交 給系統處理!
模塊中包含了不少功能代碼片段,在模塊中的代碼大部分都是私有的,意思是在模塊中定義的函數方法和變量,都只能在同一個模塊中被調用。固然,能夠將某些方法和變量暴露到模塊外,這個時候可使用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控制檯的結果就爲: