百度百科上:
Node.js是一套用來編寫高性能網絡服務器的JavaScript工具包,一系列的變化由此開始,在Node中,Http是首要的。Node為創建http服務器作了優化,所以在網上看到的大部分示例和庫都是集中在web上(http框架、模板庫等)。
Node.js的優點
下面我愉前人寫的一個資料,讓大家更清楚的了解NodeJS,前人的文章
Node 旨在解決什么問題?
Node 公開宣稱的目標是 “旨在提供一種簡單的構建可伸縮網絡程序的方法”。當前的服務器程序有什么問題?我們來做個數學題。在 Java™ 和 PHP 這類語言中,每個連接都會生成一個新線程,每個新線程可能需要 2 MB 的配套內存。在一個擁有 8 GB RAM 的系統上,理論上最大的並發連接數量是 4,000 個用戶。隨着您的客戶群的增長,如果希望您的 Web 應用程序支持更多用戶,那么,您必須添加更多服務器。當然,這會增加服務器成本、流量成本和人工成本等成本。除這些成本上升外,還有一個潛在技術問題,即 用戶可能針對每個請求使用不同的服務器,因此,任何共享資源都必須在所有服務器之間共享。鑒於上述所有原因,整個 Web 應用程序架構(包括流量、處理器速度和內存速度)中的瓶頸是:服務器能夠處理的並發連接的最大數量。
Node 解決這個問題的方法是:更改連接到服務器的方式。每個連接發射一個在 Node 引擎的進程中運行的事件,而不是為每個連接生成一個新的 OS 線程(並為其分配一些配套內存)。Node 聲稱它絕不會死鎖,因為它根本不允許使用鎖,它不會直接阻塞 I/O 調用。Node 還宣稱,運行它的服務器能支持數萬個並發連接。
現在您有了一個能處理數萬個並發連接的程序,那么您能通過 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 是一種很棒的事件驅動編程語言,因為它允許使用匿名函數和閉包,更重要的是,任何寫過代碼的人都熟悉它的語法。事件發生時調用的回調函數可以在捕獲事件處 進行編寫。這樣可以使代碼容易編寫和維護,沒有復雜的面向對象框架,沒有接口,沒有過度設計的可能性。只需監聽事件,編寫一個回調函數,其他事情都可以交 給系統處理!
擴展的模塊
模塊中包含了很多功能代碼片斷,在模塊中的代碼大部分都是私有的,意思是在模塊中定義的函數方法和變量,都只能在同一個模塊中被調用。當然,可以將某些方法和變量暴露到模塊外,這個時候可以使用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控制台的結果就為: