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


返回目錄

百度百科上:

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

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 還宣稱,運行它的服務器能支持數萬個並發連接。

現在您有了一個能處理數萬個並發連接的程序,那么您能通過 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控制台的結果就為:

 返回目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM