Node初學者入門,一本全面的NodeJS教程

來源:互聯網
上載者:User
關於

本書致力於教會你如何用Node.js來開發應用,過程中會傳授你所有所需的“進階”JavaScript知識。本書絕不是一本“Hello World”的教程。

狀態

你正在閱讀的已經是本書的最終版。因此,只有當進行錯誤更正以及針對新版本Node.js的改動進行對應的修正時,才會進行更新。

本書中的代碼案例都在Node.js 0.6.11版本中測試過,可以正確工作。

讀者對象

本書最適合與我有相似技術背景的讀者: 至少對一門諸如Ruby、Python、PHP或者Java這樣物件導向的語言有一定的經驗;對JavaScript處於初學階段,並且完全是一個Node.js的新手。

這裡指的適合對其他程式設計語言有一定經驗的開發人員,意思是說,本書不會對諸如資料類型、變數、控制結構等等之類非常基礎的概念作介紹。要讀懂本書,這些基礎的概念我都預設你已經會了。

然而,本書還是會對JavaScript中的函數和對象作詳細介紹,因為它們與其他同類程式設計語言中的函數和對象有很大的不同。

本書結構

讀完本書之後,你將完成一個完整的web應用,該應用允許使用者瀏覽頁面以及上傳檔案。

當然了,應用本身並沒有什麼了不起的,相比為了實現該功能書寫的代碼本身,我們更關注的是如何建立一個架構來對我們應用的不同模組進行乾淨地剝離。 是不是很玄乎。稍後你就明白了。

本書先從介紹在Node.js環境中進行JavaScript開發和在瀏覽器環境中進行JavaScript開發的差異開始。

緊接著,會帶領大家完成一個最傳統的“Hello World”應用,這也是最基礎的Node.js應用。

最後,會和大家討論如何設計一個“真正”完整的應用,剖析要完成該應用需要實現的不同模組,並一步一步介紹如何來實現這些模組。

可以確保的是,在這過程中,大家會學到JavaScript中一些進階的概念、如何使用它們以及為什麼使用這些概念就可以實現而其他程式設計語言中同類的概念就無法實現。

該應用所有的原始碼都可以通過 本書Github代碼倉庫. 目錄 關於 狀態 讀者對象 本書結構 JavaScript與Node.js JavaScript與你 簡短申明 伺服器端JavaScript “Hello World” 一個完整的基於Node.js的web應用 用例 應用不同模組分析 構建應用的模組 一個基礎的HTTP伺服器 分析HTTP伺服器 進行函數傳遞 函數傳遞是如何讓HTTP伺服器工作的 基於事件驅動的回調 伺服器是如何處理請求的 服務端的模組放在哪裡 如何來進行請求的“路由” 行為驅動執行 路由給真正的請求處理常式 讓請求處理常式作出響應 不好的實現方式 阻塞與非阻塞 以非阻塞操作進行請求響應 更有用的情境 處理POST請求 處理檔案上傳 總結與展望

JavaScript與Node.js

JavaScript與你

拋開技術,我們先來聊聊你以及你和JavaScript的關係。本章的主要目的是想讓你看看,對你而言是否有必要繼續閱讀後續章節的內容。

如果你和我一樣,那麼你很早就開始利用HTML進行“開發”,正因如此,你接觸到了這個叫JavaScript有趣的東西,而對於JavaScript,你只會基本的操作——為web頁面添加互動。

而你真正想要的是“乾貨”,你想要知道如何構建複雜的web網站 —— 於是,你學習了一種諸如PHP、Ruby、Java這樣的程式設計語言,並開始書寫“後端”代碼。

與此同時,你還始終關注著JavaScript,隨著通過一些對jQuery,Prototype之類技術的介紹,你慢慢瞭解到了很多JavaScript中的進階技能,同時也感受到了JavaScript絕非僅僅是window.open() 那麼簡單。 .

不過,這些畢竟都是前端技術,儘管當想要增強頁面的時候,使用jQuery總讓你覺得很爽,但到最後,你頂多是個JavaScript使用者,而非JavaScript開發人員。

然後,出現了Node.js,服務端的JavaScript,這有多酷啊。

於是,你覺得是時候該重新拾起既熟悉又陌生的JavaScript了。但是別急,寫Node.js應用是一件事情;理解為什麼它們要以它們書寫的這種方式來書寫則意味著——你要懂JavaScript。這次是玩真的了。

問題來了: 由於JavaScript真正意義上以兩種,甚至可以說是三種形態存在(從中世紀90年代的作為對DHTML進行增強小玩具,到像jQuery那樣嚴格 意義上的前端技術,一直到現在的服務端技術),因此,很難找到一個“正確”的方式來學習JavaScript,使得讓你書寫Node.js應用的時候感覺 自己是在真正開發它而不僅僅是使用它。

因為這就是關鍵: 你本身已經是個有經驗的開發人員,你不想通過到處尋找各種解決方案(其中可能還有不正確的)來學習新的技術,你要確保自己是通過正確的方式來學習這項技術。

當然了,外面不乏很優秀的學習JavaScript的文章。但是,有的時候光靠那些文章是遠遠不夠的。你需要的是指導。

本書的目標就是給你提供指導。

簡短申明

業界有非常優秀的JavaScript程式員。而我並非其中一員。

我就是上一節中描述的那個我。我熟悉如何開發後端web應用,但是對“真正”的JavaScript以及Node.js,我都只是新手。我也只是最近學習了一些JavaScript的進階概念,並沒有實踐經驗。

因此,本書並不是一本“從入門到精通”的書,更像是一本“從初級入門到進階入門”的書。

如果成功的話,那麼本書就是我當初開始學習Node.js最希望擁有的教程。

服務端JavaScript

JavaScript最早是運行在瀏覽器中,然而瀏覽器只是提供了一個上下文,它定義了使用JavaScript可以做什麼,但並沒有“說”太多關於 JavaScript語言本身可以做什麼。事實上,JavaScript是一門“完整”的語言: 它可以使用在不同的上下文中,其能力與其他同類語言相比有過之而無不及。

Node.js事實上就是另外一種上下文,它允許在後端(瀏覽器外用環境)運行JavaScript代碼。

要實現在後台運行JavaScript代碼,代碼需要先被解釋然後正確的執行。Node.js的原理正是如此,它使用了Google的V8虛擬機器 (Google的Chrome瀏覽器使用的JavaScript執行環境),來解釋和執行JavaScript代碼。

除此之外,伴隨著Node.js的還有許多有用的模組,它們可以簡化很多重複的勞作,比如向終端輸出字串。

因此,Node.js事實上既是一個運行時環境,同時又是一個庫。

要使用Node.js,首先需要進行安裝。關於如何安裝Node.js,這裡就不贅述了,可以直接參考官方的安裝指南。安裝完成後,繼續回來閱讀本書下面的內容。

“Hello World”

好了,“廢話”不多說了,馬上開始我們第一個Node.js應用:“Hello World”。

開啟你最喜歡的編輯器,建立一個helloworld.js檔案。我們要做就是向STDOUT輸出“Hello World”,如下是實現該功能的代碼:

console.log("Hello World");

儲存該檔案,並通過Node.js來執行:

node helloworld.js

正常的話,就會在終端輸出Hello World 。

好吧,我承認這個應用是有點無趣,那麼下面我們就來點“乾貨”。

一個完整的基於Node.js的web應用

用例

我們來把目標設定得簡單點,不過也要夠實際才行: 使用者可以通過瀏覽器使用我們的應用。 當使用者請求http://domain/start時,可以看到一個歡迎頁面,頁面上有一個檔案上傳的表單。 使用者可以選擇一個圖片並提交表單,隨後檔案將被上傳到http://domain/upload,該頁面完成上傳後會把圖片顯示在頁面上。

差不多了,你現在也可以去Google一下,找點東西亂搞一下來完成功能。但是我們現在先不做這個。

更進一步地說,在完成這一目標的過程中,我們不僅僅需要基礎的代碼而不管代碼是否優雅。我們還要對此進行抽象,來尋找一種適合構建更為複雜的Node.js應用的方式。 應用不同模組分析

我們來分解一下這個應用,為了實現上文的用例,我們需要實現哪些部分呢。 我們需要提供Web頁面,因此需要一個HTTP伺服器 對於不同的請求,根據請求的URL,我們的伺服器需要給予不同的響應,因此我們需要一個路由,用於把請求對應到請求處理常式(request handler) 當請求被伺服器接收並通過路由傳遞之後,需要可以對其進行處理,因此我們需要最終的請求處理常式 路由還應該能處理POST資料,並且把資料封裝成更友好的格式傳遞給請求處理入程式,因此需要請求資料處理功能 我們不僅僅要處理URL對應的請求,還要把內容顯示出來,這意味著我們需要一些視圖邏輯供請求處理常式使用,以便將內容發送給使用者的瀏覽器 最後,使用者需要上傳圖片,所以我們需要上傳處理功能來處理這方面的細節

我們先來想想,使用PHP的話我們會怎麼構建這個結構。一般來說我們會用一個Apache HTTP伺服器並配上mod_php5模組。
從這個角度看,整個“接收HTTP請求並提供Web頁面”的需求根本不需要PHP來處理。

不過對Node.js來說,概念完全不一樣了。使用Node.js時,我們不僅僅在實現一個應用,同時還實現了整個HTTP伺服器。事實上,我們的Web應用以及對應的Web伺服器基本上是一樣的。

聽起來好像有一大堆活要做,但隨後我們會逐漸意識到,對Node.js來說這並不是什麼麻煩的事。

現在我們就來開始實現之路,先從第一個部分--HTTP伺服器著手。

構建應用的模組

一個基礎的HTTP伺服器

當我準備開始寫我的第一個“真正的”Node.js應用的時候,我不但不知道怎麼寫Node.js代碼,也不知道怎麼組織這些代碼。 
我應該把所有東西都放進一個檔案裡嗎。網上有很多教程都會教你把所有的邏輯都放進一個用Node.js寫的基礎HTTP伺服器裡。但是如果我想加入更多的內容,同時還想保持代碼的可讀性呢。

實際上,只要把不同功能的代碼放入不同的模組中,保持代碼分離還是相當簡單的。

這種方法允許你擁有一個乾淨的主檔案(main file),你可以用Node.js執行它;同時你可以擁有乾淨的模組,它們可以被主檔案和其他的模組調用。

那麼,現在我們來建立一個用於啟動我們的應用的主檔案,和一個儲存著我們的HTTP伺服器代碼的模組。

在我的印象裡,把主檔案叫做index.js或多或少是個標準格式。把伺服器模組放進叫server.js的檔案裡則很好理解。

讓我們先從伺服器模組開始。在你的項目的根目錄下建立一個叫server.js的檔案,並寫入以下代碼:

var http = require("http");http.createServer(function(request, response){  response.writeHead(200,{"Content-Type":"text/plain"});  response.write("Hello World");  response.end();}).listen(8888);

搞定。你剛剛完成了一個可以工作的HTTP伺服器。為了證明這一點,我們來運行並且測試這段代碼。首先,用Node.js執行你的指令碼:

node server.js

接下來,開啟瀏覽器訪問http://localhost:8888/,你會看到一個寫著“Hello World”的網頁。

這很有趣,不是嗎。讓我們先來談談HTTP伺服器的問題,把如何組織項目的事情先放一邊吧,你覺得如何。我保證之後我們會解決那個問題的。

分析HTTP伺服器

那麼接下來,讓我們分析一下這個HTTP伺服器的構成。

第一行請求(require)Node.js內建的 http 模組,並且把它賦值給 http 變數。

接下來我們調用http模組提供的函數: createServer 。這個函數會返回一個對象,這個對象有一個叫做 listen的方法,這個方法有一個數值參數,指定這個HTTP伺服器監聽的連接埠號碼。

咱們暫時先不管 http.createServer 的括弧裡的那個函數定義。

我們本來可以用這樣的代碼來啟動伺服器並偵聽8888連接埠:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.