>>所有權利。
所以懸念是，究竟是 node.js的，你今天知道嗎？
什麼？是嗎？
>>這就像一個 框架編寫JavaScript
應用廣泛 -
>>行，行了。
>> - 我知道像 常見的用途一樣 -
或者你的東西 能做的就是像 -
[無聲備註]
>>好啊好啊。
是啊，所以這是一個框架。
這是一個引擎，通過它 可以執行JavaScript代碼
服務器站點。
這可能意味著該 最簡單的東西
就像寫一個命令行 腳本不是在Python或bash
或Ruby或PHP，但只是 在JavaScript本身
並在執行它 閃爍的命令提示符。
或者你可以實際運行 它在Web服務器中。
並在事實上 node.js的本身，
這個框架是一大堆 其中有庫
在HTTP服務器內置的。
所以，你其實可以寫 一台服務器，因為我們會看到
在短短的一瞬間，超容易 通過只了解了一下
的HTTP和TCP和端口。
而且你可以生成一個監聽 沒有Apache Web服務器，
沒有微軟的IIS。
沒有任何其他 已安裝的軟件，
你可以釀出這 並聽取大多數任何端口
系統上的 你被允許。
所以情況並指出， 讓我去開
了這個例子中，服務器0.js。
所以，請注意頂部 這個文件，只是一堆
無趣的意見， 然後有一對夫婦
的代碼行代表 我們會看到recurringly。
因此，無功的HTTP獲取 要求“HTTP”。
所以內置到的Node.js' 基礎設施是一大堆
模塊，這是真正的剛 圖書館和一切排序
與名字空間 的唯一標識符
像這樣的是“HTTP”。
所以，像在許多 像Java和C + +語言
和C，只有當你 導入或包括
或者在節點要求發言 一個模塊執行其位。
和所有的記憶 需要得到加載
到RAM中並因此使用。
所以，你有點加載此 點播庫或模塊。
這意味著繼續前進，需要
對這一計劃 在HTTP庫，
並參考該庫由 一個叫做HTTP變量的方式。
但這種左手符號可能 被稱為什麼，富，
酒吧，巴茲，也沒關係。
所以不像C + +和Java和 當你需要C其中
或導入庫， 它只是排序
變成全局訪問，
Node.js的模塊 更緊密的命名空間。
從而使自己的生活 - 該功能 是唯一能夠在瞬間
這個變量名的方式。
你不能只是開始 存在的分型方法
在它的權利的方式 這也許是好事，
因為這時你的命名空間 沒有得到幾乎一樣雜亂
在很多語言。
好了，所以現在作為公共 建議，創建一個HTTP服務器
喬納森[假設拼寫] 有可能是字面上
簡單，只要調用 裡面創建服務器的方法
HTTP模塊的。
所以，這是回歸 參考
以某種Web服務器。
它來到了Apache，不 一定是沉甸甸的分量。
這其中的一點點簡單。
而現在，我要的只是 簡單地做了幾件事情。
因此，首先讓我滾動 到此處的底部
並跳過處理程序 方法片刻。
並請注意下面這行代碼，
服務器進行。這是 基本上是指服務器 -
聽像jQuery代碼，
偵聽的事件 所謂的請求
而只是採取一種猜測 我該怎麼辦
當一個請求事件 火災中的服務器。
是嗎？
>>調用函數處理程序。
因此，從字面上執行 這是引用的代碼
由這個變量和實際 不是一個變量符號在這裡，
那是什麼符號 指的是？
嗯，這個名字 在這裡起作用了
和處理顯然 有兩個參數。
為什麼是兩個？好吧，如果你只是 閱讀任何文件
對於這個特殊的模塊，您 將被告知處理程序
將要調用將 通過至少兩個參數，
一個參考於該請求，
和要求，我們的內部 從字面上的意思是HTTP請求。
因此，所有這些HTTP頭 您可能還記得
從的開始 學期或某些類前
還是喜歡體驗 得到線和主機線
和用戶代理線，所有這一切 封裝多內
申請對象。
和響應對象 整理出站數據。
所以，你必須引用一個 反對那將讓你
發送回信息 瀏覽器通過調用方法
在這後一種說法 所謂住宅的響應。
但是，這可能是名為foo或 吧，這只是慣例。
所以，現在，我該怎麼辦？
哦，看來這裡面 這個超級簡單的web服務器
我正在實施，我 要做到以下幾點。
我打算寫一個HTTP 狀態碼200頭，
200的含義確定，一切都很好。
然後，我會 傳遞明顯。
什麼是的數據類型 第二個參數，以正確的頭上？
>>這是一個對象？
>>這是一個與對象 多少個鍵和值？
只是各一個，右， 對中的一個鍵值。
因此，“內容類型”。
而唯一的原因 我引用在這裡是
因為連字符可能是 混為一談為一個減號
或者類似的東西。
所以，我在這裡引用一下， 燒毛或雙引號。
但同樣常見的範式
在JavaScript代碼常常是 單引號這些天，
冒號，然後該值。
所以，這只是 所謂心靈的類型。
這是一個HTTP頭 這是從字面上去
要內容連字符類型結腸癌 文字斜線平原這回事
可以從發送 服務器向瀏覽器
讓瀏覽器知道 是否要運行此作為原始文本
或者HTML或作為 圖像或電影
或者一個Flash文件或 別的。
現在，你在哪裡其實我是想 在頁面的正文發送？
那麼，就由閱讀 文檔
為響應對象 這裡面的圖書館。
我看到有一個正確的 方法和需要一個字符串，
也許其他的事情，但 最小的字符串。
而字符串是什麼 吐到瀏覽器。
在這種情況下，其超 簡單，它的hello world，
但它可能是OPNE 支架，HTML，關閉支架，
打開支架頭緊 支架等等，
這可能是原始的HTML。
但我們保持例子 通過只簡單吐痰
出了最簡單的頭腦類型 這可以說是text / plain的。
然後response.end剛 意味著關閉連接
送我的一切 排序緩衝裡面
這個對象回 到瀏覽器。
我所做的一切。好的。
所以，過去的事情 我做下來這裡
這是有點 任意的，意思是很酷的，
是我說的 服務器終於聽
在一個特定的TCP 默認端口。
從開始召回 類服務 -
或者您通常唯一 用數字標識，
AD是網絡，443是基於HTTP的 網站，22是SSH的，21是FTP
而1337僅僅是任意的 但它比1024的
這意味著在大多數 系統，我可​​以用它
無需超 用戶權限。
所以它只是方便。
但8080是關機 - 一種常見的 1，8088，真的什麼大
在成千上萬的普通 但是這僅僅是更多的精英。
好吧，那麼會發生什麼 當我真正運行這個？
好吧，我不只是參觀 在網頁瀏覽器中。
此文件被稱為服務器0.js。
因為再次，Apache是 現在出來的圖片
對於後半部 的過程。
如果我想網 服務器，我需要寫
然後運行該Web服務器。
但事實是JavaScript 兩個客戶端上的
和在服務器端的 一種解釋型語言。
所以，我需要的是 翻譯。
所以it's - 如果堅持跑 節點，然後服務器0.js，
我可能會或可能不會看到 根據一些輸出
什麼庫我已經包括， 似乎沒有任何要發生的事情。
但讓​​我去 瀏覽器讓我走
到相同的IP地址 我的CS50的客戶。
但是這可能只是 還有是我的Mac
或我的電腦，然後按下回車鍵。
這實際上看起來像Apache。
這就像目錄 上市我們看
在上半年。
所以，我做了什麼錯？
是啊。
[無聲備註]
沒錯，對不對？
因此，Apache是​​還在聽 在默認端口80。
雖然我可以改變這種狀況， 我可以把它關掉在一起
但它仍在運行。
但這些傢伙能 當然共存。
我只是必須把 結腸1337以及隨後可能
或者也許不是一個斜線 結束訪問此端口
此服務器上運行。
現在我看到， 你好，世界又回來了。
和我打重裝作為 因為我想了很多次，
它仍然擔任了一個網頁。
事實上，如果我打開Chrome的 檢驗員，去網絡
然後重新加載整個頁面，
請注意，這的確是 所發送的請求。
如果我看原料來源，
注意到我的瀏覽器發送 所有這些事情。
，然後從反應 服務器是超級簡單。
還有就是200。
如果它不是太低 在屏幕上，
有內容類型。
然後Node.js的 排序自動
我添加的日期和 所有其他的東西
該瀏覽器通常期望。
那麼，就讓我們看到了 小完整性檢查。
讓我回去的代碼 在服務器0.js，讓我 -
每次我進入 處理程序，
我只想說的console.log。
（“我們有一個訪問者！”）。
我不需要重新編譯 或類似的東西，
它是一種解釋型語言。
所以，現在，讓我回去 的頁面，重新加載一個，兩個，
三次，並去 回到我的窗口。
現在我看到這一點。
那麼這是奇怪的， 我看半年線。
有趣的網頁瑣事，何必當初 我拿到六要求不是三個？
是嗎？
[無聲備註]
是啊。所以，你可能知道的 在頂部的小傻瓜圖標
瀏覽器吧，很多
網站使用強權 是哈佛波峰，
這可能是一個公司的標誌 或類似的東西。
所以，那種瀏覽器，這些天
中擅自作出 額外的HTTP請求
幾乎每一個網站， 您訪問檢查，如果有
默認情況下，一個文件 所謂的favicon.ico
在相同的目錄中 您所要求的文件。
如果是的話，它把 該圖標在那裡。
所以我們現在看到 正是這一點。
而事實上，讓我們來看看，如果我們 可以看到這個，而不是類型
剛出來，“我們有一個訪問者。
讓我繼續和輸出。
我只從知道這個 在看文檔。
有內部的屬性 所謂URL的請求對象
這恰好是路徑
會議要求 在實際的URL。
所以，如果我重新啟動服務器 簡單地通過重新運行節點
在服務器0.js和 現在做這個一，二，
3，回到這裡。
在那裡，它是。
斜線就是我 - 請求人
在favicon.ico的是 什麼是瀏覽器
擅自要求。
但問題是不 這麼多的favicon的東西
但如何在服務器操作。
是嗎？
>>為什麼有 會有一些要求？
>>為什麼會得 - 通過HTTP的工作性質。
因此，HTTP只能請求 一個文件的時間。
瀏覽器可以智能的這些天
並保持了TCP 連接打開。
如果你把CS143或一般 熟悉網絡，
這樣你就可以得到提高效率
通過保持網絡 套接字打開
在使多個HTTP 連續請求了它
但他們是一個文件 每個請求。
所以，如果你訪問 類似的東西 -
我的意思是，我們可以去 幾乎所有的網站。
如果你去 - 讓我們拉起 在Chrome的檢查員在這裡。
它可能會得到最補 頁面。
進入網絡選項卡 並前往www.cnn.com。
而當你參觀 cnn.com，它的主頁 -
您的瀏覽器而殘暴 讓 - 仍然計數。
確定。至少289的HTTP 請求連連。
這就是為什麼當你參觀 特別是臃腫的網站，
他們是緩慢的加載 因為所有的
資產，他們正在加載。
因此，它看起來像298。
可能有一些Ajax 或去在這一點上有些
資產只是低。
這樣，每一個這些是 單個請求回去
來回，來回。
這就是為什麼前面，甚至 雖然有點我們聊
它富於幻想 你把腳本標記，
絕對使 當你有差異 -
它開始有很多 交通和大量的
被請求的文件。
和每個這表示 大概的圖像，媒體文件，
一個JavaScript文件， CSS文件或類似物。
因此，我們已經達到 約4兆剛
來看看今天的新聞。
好問題。
好的。
那麼，什麼是一些 有利的一面，但？
好吧，我們知道如何使 網頁已經使用PHP。
和很多人進來 該類知道的Django
和Python或導軌和紅寶石。
那麼，為什麼我們還需要另一種 語言和基礎設施？
什麼是特別的Node.js 好，如果你知道？
[暫停]
有些事情嗎？
沒有？是嗎？
>>中繼消息。
>>所以，傳送信息。
所以，這是真的，這是真的 對於更多的技術原因
和Node.js的，真的 JavaScript是特別
非常適合於異步 代碼，
如果，讓你創造 幻覺
做多的 件事情。
所以，即使它們是 真的發生了連續，
事實上，在大多數情況下， 雙方的JavaScript客戶端
和服務器端是 單線程的。
其中，如果你正在服用161 甚至61意味著 -
這個方案的認識，
解釋器可以從字面上 只做一件事一次。
但是，這也不是很大的 像Web服務器
在那裡你可能有幾十或 數百或什至數千
用戶所有的嘗試 訪問你的網頁
在同樣的時間。
然而，該建議 在處理逐一
後後的其他 其他的，特別是如果一些
這些正如我們所看到的請求 在CNN可能需要服
之前你300個文件 即使到達下一個用戶
誰願意看到的消息說。
Node.js的更適合 對於環境這樣的。
因為發生的事情是 任何運行緩慢的過程
就像從磁盤中讀取文件或 查詢數據庫或說話
到一些其它的網絡服務器，
趨向於具有 延遲，對不對？
如果你沒有把61或161 特別是所有這類
周邊服務 往往要慢得多
不是做任何事情的內部 同一RAM和相同的CPU
該說在這種情況下 服務器實際運行。
但是，什麼是好的關於 node.js的是，你可以 -
和JavaScript更普遍 是，你可以做一些事情
然後說：“嗯， 這是怎麼回事
帶我幾毫秒 或什至幾秒鐘。
讓那種我叉即關，“ 但它不是一個真正的進程。
然後，當它完成做 那緩慢的運行過程
就像從一霎那行 數據庫或讀取文件。HTML
從磁盤，它會 回到我寧可
比我不必等待它。
因此，為了使這更清楚。
這是我的方式 使這個比較熟悉。
好了，所以這是 在廣場上​​動搖小屋。
這是形式的 常見的範例
解釋異步性。
這實際上是一個很好的 例如，由於搖小屋
和美味的漢堡是顯著 慢為他們做什麼。
但問題是，他們是 在接受訂單真的很不錯
並把你的錢後， 你為你的食物等。
所以，這其實是一個更好的 設計比替代。
假設，因為你走進 像這樣的店，你有
到該行的前面和你 放置您的訂單，並且您希望
到漢堡，盡我所能 說，它需要至少五
分鐘或更長時間，以 實際上得到一個漢堡。
因此，這將是一種 一個壞的商業模式
如果你在等待你的，而 漢堡，愛麗絲[假設拼寫]
和鮑勃·[假設拼寫] 和查理[假設拼寫]
和大家一樣是 排隊在你身後
你是從字面上阻塞 該行等待你的食物。
所以，很顯然，在搖小屋
和其他的快餐 地方不這樣做，
他們做這樣的事情。
他們給你一個蜂鳴器。
和他們那種 發送你對你的方式。
他們叫你回來 使這個小東西震動
或閃爍以引起你的注意。
所以，這簡直是什麼？
類似的node.js一樣。
如果node.js的或JavaScript 更一般地被使用
和編程 夠聰明
來實現的，“你知道嗎？
無論我需要做的正確的 這裡可能需要一些數
毫秒或秒。
你知道嗎？
讓我繼續前進，不 同步調用它 -
“那傢伙是阻斷 所有人都一致，“ -
讓我繼續前進， 排序靠邊站
並簡單地稱自己背
時長時間運行 操作完成。“
和回調的過程 是暗指在這種情況下
一個回調函數， 參考代碼卡盤
這將得到執行 當你的漢堡是準備好了，
就像這個東西有一定的 這類功能內置的
它開始振動或 嗡嗡當它的時間為您
被稱為回 前行。
那麼，這是什麼 意思是實質？
好了，我們要 我們的工作方式了。
那麼，讓我繼續前進 做這第一個。
在服務器1.js，讓我 首先簡化代碼
所以我們可以採取小步走向 一個更引人注目的問題。
這是確切的相同 程序，我以前寫過。
但是，已經改變？
有某種輕微 語法差異
這之間 版本0剛才。
什麼跳出來在 你是否還記得？
是啊辛西婭[假設拼寫]？
[無聲備註]
是啊。所以，現在，我們有一個行 函數被傳入的
我們已經戒掉了幾分
這種白白命名 處理函數。
無用僅在該前 甚至把它在一個地方，
我並不真的需要 浪費時間給它起名字
，更難使其成為 閱讀代碼從上到下。
那麼，就讓我們在線申報 是一個匿名函數。
和我做其他的兩件事情。
我現在過的好 使用點符號的。
所以像jQuery中，很多節點 方法可以鏈接在一起。
所以，一旦你完成調用 什麼，你沒有
等待一個新行 並調用另一個方法，
你可以只鏈 它們連接在一起。
因此以這種方式，我們可以 真的收緊這件事。
所以，這實際上是一種 在五行Web服務器
代碼總不像 -
不像你可能常 要做設置的東西了。
如果我進入服務器 2現在，讓我們做到這一點。
在服務器2 - 居然讓我們 回來到該服務器2。
現在，讓我們打開了異步，0.js和 解決這一問題在眼前。
因此，首先讓我們去 進取，開放
了異步-0.js在瀏覽器中。
因此，異步-0，讓我走 返回到瀏覽器。
打重裝。
而現在，這是一種 的錯誤消息。
事實上，我看到一個500 在Chrome的檢查。
但讓​​我更準確地 要求hello.txt的。
確定。所以，這似乎工作。
因此，異步，0.js好像沒有 成為了某事為斜線。
它沒有缺省文件的支持。
但是，如果我明確 要求hello.txt的，
這似乎是支持的。
這是為什麼？
嗯，我在這裡走了
並完成實施 一個超級簡單的web服務器
演示哪裡 異步性可以是有用的。
那就是實施 如下。
首先，我使用的是 HTTP模塊再次，
而且其中的FS 可能是代表什麼嗎？
一般來說，在CS，文件系統。
確定文件系統。
因此提出的FS，文件系統。
好吧，那又怎樣 這是否能給我嗎？
相關的功能 像獲得通過的文件，
打開文件，寫 目錄，讀取目錄
和所有這樣的東西的。
所以，現在發現，這個代碼 是和以前一樣，
創建服務器，通過 在一個匿名函數。
這是有點任意的。
這並不是一個非常 安全的Web服務器。
事實上，你可以訪問 在我的硬盤驅動器幾乎任何文件
或者在服務器的硬盤 通過執行此代碼驅動
因為我只是一味地 假設我要去
搶無論用戶 請在URL中。
而我要去 與點它的前綴
所以，我很勉強 是安全的
說什麼文件，他們可以 請求必須至少啟動
在當前目錄中。
當然，這裡有一個威脅。
因為如果他們不是 包括什麼？
在他們的道路，他們可以種 為解決這一點。
點，點，對不對？
因此，如果用戶只是把點， 點中的URL，理論上
他們可以開始越來越 我 - 說密碼文件。
因此，這並不意味著 進行擔保，
它的意思很簡單。
所以在這裡，我有一個變量，它 是點的串聯
這是目前的目錄 與請求的URL
我們看到了以前是 像斜線或/ hello.txt的。
所以，現在，它得到一個 更有趣一點。
首先，請注意底部。
我在聽的 相同的端口和以前一樣。
所以，真正有趣 工作是在這裡裡面。
每次請求 按性質進來
這段代碼，我在做什麼？
我打電話檔 系統讀取文件的方法，
通過在路徑中 我想讀。
而現在，這是 這裡，有趣的，
這是實現 在異步方法。
你不能得到回報 值從讀文件。
事實上通知，有 沒有左手的表達
讀取文件的左側。
它不會返回一個值。
相反，它會調用一個回調 功能，當它準備
給你一個答案。
所以，再一次要清楚， 而在昔日，
在許多編程 語言，如果你想
讀取文件的情況下， 在PHP點，
文件下劃線得到 強調內容，
你有一個左手的表達 在所有的價值後 -
等號前， 這意味著你分配
該變量的回歸 該函數的值。
你可以這樣做，在node.js的， 但你通常有
以顯式調用同步 功能版本的喜歡，
我認為這是讀取同步 文件或同步讀取文件。
我忘了他們是如何把它命名。
而這將使 您的返回值。
但是，如果該文件是在 一些遠程文件系統
或磁盤僅僅是天生的慢性子， 它可能需要10毫秒
或2秒該文件 實際上回來。
同時，沒有其他網站 遊客被服務
通過你的網站開通。
你堵。
這就是被稱為 阻塞IO，輸入/輸出。
所以在這裡，這是聰明得多。
因為Node.js的東西是怎麼回事
做口譯時 在下面的，
它會調用 讀取的文件的方法，
嘗試一上來誰擁有該文件 由值P指定的路徑
然後如果和當它準備 給你回的內容
該文件的P，它會調用 它的簽名是一個函數
按照慣例以下。
兩個參數，第一個 這也許是一個錯誤的對象，
大寫字母E，它是一個對象 所謂的錯誤或空
如果沒有這樣的錯誤。
第二個參數 - 以 一個猜測 - 將是什麼？
這顯然是所謂的數據，但 什麼是數據更具體？
>>內容？
>> hello.txt的內容 在這個例子中我拉
在瀏覽器中剛才。
所以，換句話說讀取文件 和許多Node.js的功能
就像在不返回值。
他們稱之為回調，並通過
這些回調會是什麼 過傳統的
返回值。
這種方法的好處是
您可能會調用 讀取文件中的T0。
回調函數可能 不能被稱為一個刻度後
可以這麼說在T，它 可以被稱為T1000，
一千年以後蜱。
但問題是，該 其餘在這個文件中的代碼，
如果立即將任何 可同時執行的Node.js
以及當文件系統 數字如何讀
該文件並獲得 回給你。
所以，你創建這個 -
所以有效的錯覺
並行性，同時讓 較慢的正在運行的進程是不
封鎖重要的東西， 那部分用戶提供服務。
那麼，我們該如何處理呢？
這是一個非常普遍的 node.js的典範。
還有的方法只是為了簡化 這是我們會看到沿前。
如果我先檢查 錯誤不為null。
所以，如果它不是假的 再有就是一個錯誤。
我不知道那是什麼， 也許該文件不存在。
我沒有權限。
該路徑是錯誤的。
任何數量的東西 可能出問題。
現在，我要 擅自返回500
這是內部服務器錯誤。
出事了。
我真的不關心 診斷它。
那麼，就讓我們告訴 用戶它的破碎。
然後，我會 做res.end，
這是速記符號。
記得，去年 一次，我做了res.write
然後我做了res.end。
如果你只是想 發送一行輸出，
你可以做一次全部 與res.end有一個參數，
而這要發送 任何錯誤信息是
此對象的內 到瀏覽器。
那是相當拉弧 剛才回憶。
我不知道這是什麼 乍一看意思。
但是，當我請求 不存在的文件 -
哎呀，我們需要運行 服務器再次。
當我要求的檔案 根本不存在，EISDIR，
所以一些有關 它是目錄，
如果我做一些隨機的 串那裡，
顯然這意味著 文件不存在。
那是因為我的代碼 只是說寫
出了什麼原料 錯誤消息是，
所以不是很人性化 但至少我處理它。
否則，如果它不是一個 錯誤我在做什麼？
同樣的事情之前，吐 出了200行，一個普通的 -
text / plain的頭腦和類型 然後吐出的數據。
這就是為什麼我得到的 hello.txt的內容只是其中
確認如果我看了 在hello.txt的，
這只是字面上 你好，世界。
如果我改變了這個 你好，世界，保存文件，
重新運行該服務器， 重新加載頁面。
現在，我得到的版本。
所以，我真的只是 重新實現一個Web服務器
如存在很多 年，但使用node.js中
但我們可以做到這一點 更乾淨。
讓我打開異步-1.js。
現在，請注意我添加 另一個模塊這個時候，
顯然路徑模塊。
現在，這是一個很好的 機會看看
在什麼樣的文檔 模樣。
Node.js的是文檔。
PHP之類的，我認為是 其實還不錯
和直截了當。
如果我去的Node.js和谷歌 並搜索node.js的路徑，
你會看到什麼，通常 是直接鏈接到一個網址
我忍了這裡剛才。
所以/ API是官方的地方 去文件。
什麼，你會看到在頂部
節點的官方文檔 是所有的方法和
或內部性質 這個特定的模塊，
其中之一是被稱為連接。
並加入是輔助函數 這是怎麼回事，讓我
不與理會 所有的加號。
並且它的加入 獎金，你會看到
從碼頭是也 歸一化產生的路徑。
因此，如果用戶或你有圓點 或點的點或任何組合
那些種相對的 路徑，有利的一面之中
該接合方法的是 它會清除所有的了
給你一個規範 沒有任何路徑
這些點或點的點。
所以，這是一個好東西 一般為了安全，至少
如果你檢查 返回值我不
在這個特定的簡單情況。
但我也想用它。
所以，我現在創建一個路徑 多一點編程
與path.join代替 的原始連接。
所以，這是一個小 比以前更乾淨。
現在發現我是一個 小更智能，而
不僅僅是盲目 試圖讀取該文件，
我要去實際 打電話fs.stat。
所以，如果你熟悉
與低級的C 函數和C，甚至是PHP的。
很多圖書館都有 這個函數stat返回
實質上統計 上的文件，文件的大小，
的權限，名稱 之類的東西，
同時也含蓄地，如果 該文件存在與否，
如果它是一個文件或目錄
或符號鏈接 還是其他什麼東西。
所以，現在發現，我 調用fs.stat。
根據當時顯然和 該文檔，
我應該回去 在Error對象
或空跟著 由統計對象。
但是，讓我們看看這個， node.js.fs.
這裡是文件 系統文件。
讓我找的統計。
還有很多更 這裡的功能。
哎呀，那統計同步，fs.stat。
所以在這裡，它是異步 統計（2）。
如果你的意思是 從主網頁記住，
主頁第2章，
這意味著這是字面上 只是一個節點實施
低級別的 系統函數stat。
因此，回調得到兩張 論據，錯誤和統計
其中統計是 fs.stats對象。
因此，讓我們看看這是什麼對象 應該是什麼樣子的。
讓我們單擊超鏈接 我看得出來。
的統計對象包含 顯然一些輔助方法，
是文件，是目錄，是 一堆其他東西。
這是“是”的文件，我不在乎 大約在這個特殊的情況下。
所以在這裡我走了。
如果有錯誤，則 讓我保釋這段時間
並承擔。
如果有錯誤，它是 大概沒有找到一個404文件。
這可能是別的東西
但我是一個小 懶這裡只是集中
有關更多有趣的細節。
但是對於用戶的 的目的，文件沒有找到，
如果有任何錯誤 說明文件。
否則，讓我檢查 文件確實是一個實際的文件。
所以，如果它不是一個 文件，它的存在。
有什麼東西存在，但 它可能是一個目錄
或者一個符號鏈接
還是其他什麼東西這是 時髦的文件系統上。
無論哪種方式，用戶 不應該看到它。
所以，現在，我只是要吐
出常規 未經授權403。
但同樣只是一個約定，
我可以使用 在理論上別的東西。
然後最後，讓我 試圖讀取該文件。
所以，讓我向下滾動。
現在發現這是哪裡 該代碼可以變得有些混亂，
請注意，我打電話 fs.readFile通過
在相同的路徑，同時 回調為最後一次，
所以以前的版本。
然後，如果我發現 -
如果我沒有找到它， 我吐出500元。
如果我發現它，有什麼 行我們要在這裡看到？
我們要看到的FS 寫頭200可能
和res.end發送 的實際數據。
但是請注意這一點。
這不是示範 的最壞的情況。
但我有這個統計的呼叫 這裡比我有一些東西。
然後，我有另一個 異步調用在這裡，
所以更多的壓痕。
所以，只是一種推斷 如果你能在這裡。
有什麼問題常常出現的 如JavaScript語言
在這種環境中，其中 你沒有返回值
而是你有 這些回調。
當然，這僅僅是 文體事情的事實
我不斷縮進。
但拿這個去 合乎邏輯的下一步。
假設有一個或 兩個或三個其他功能
我需要執行該 在性質上屬於異步，
因此，你只是種 保持縮進來處理它們，
處理它們，處理它們。
你會得到某種回調 地獄隨著人們稱它為
你的代碼開始的地方 得到非常廣泛
並坦言真的很難看。
正因為如此，我可以有點勉強 告訴大家，這是形式的流
有這種
的文體角度的 事情怎麼回事。
所以，這是不理想的，因為 這可能很快會變
機構臃腫，即使兩個 異步調用不
這麼大的交易。
因此，我們能夠避免這一點，對不對？
你可能已經瞥見了 我剛才misclicked。
在文檔中，你知道， 它看起來像有statSync。
而statSync不採取 回調作為參數。
它只需路徑，因為 它顯然是做什麼？
它返回一個實例 fs.stats的。
所以這可能是你的 第一直覺，對不對？
特別是如果回調函數
和異步性是 小新的給你，坦率地說，
最簡單的方法可能是 只是避免了所有問題
一起，回去排序 CS101編程風格
在那裡你調用函數或 方法，返回值，
調用函數，返回 的價值，
函數，返回值。
我可以因此使用 fs.statSync
這是字面上相同 但它是一個同步版本
這意味著它返回 的值。
它不傳遞 value要回調。
但是，為什麼這可能是一個 最理想的解決辦法訴諸
要同步功能？
是嗎？
[無聲備註]
確切地說，它需要很長的時間。
你只是放緩 都記錄下來。
因為就像奶昔小屋 或美味的漢堡，如果他們擺脫了
那些蜂鳴器，並提出你的， 客戶站在櫃檯
行，直到你的食物準備好 即使考慮訂單之前，
後面的人的 你明明
通過放減慢。
人們開始離開， 那種你畫包。
你可以做任何數量 的類比在這裡。
但在短期，它的 恐怕不是一件好事
商務或服務器。
所以異步代碼是 通常善於至少
在這種情況下，但是它肯定 開始引起一些焦慮。
而事實上，我敢說，當 先寫這些東西，
它會帶一點點 使用得到位。
所以，讓我們開始裝備 你有一些庫
和技術，使 這更容易一些。
因此，最常見的一種 庫是常用庫
這些天，這 一個叫async.js。
而像很多的node.js的 庫或模塊
這些都是開源的。
他們幾乎所有的生活，並得到 樞紐庫客氣
之成為事實上的 地方存放這些東西。
然後有一個 整個基礎設施
安裝這些東西 所謂故宮，節點程序包管理器
而如果你熟悉 與EvanTube是一種
像應用程序或應用程序獲得。
如果你熟悉 與Red Hat和Fedora
如在設備中， 它像極了。
但它是一個節點 - 這是 的軟件包管理器只是
對於這個特定的環境。
因此，我們可以下載和安裝 事情，比如異步庫
並且還另外一個叫 下劃線庫或模塊。
但這些遠FS，HTTP路徑，
這些都是來 內置於節點。
因此，如果我們去了API文檔， 你會真正看到了建
為節點，你會得到免費 一大堆的模塊。
但很多不錯的人 互聯網已經取得了數十項
如果幾百個不 其他圖書館
更好地做事 或不同。
那麼，讓我們來看看 怎麼這個庫的工作原理。
所以，大部分代碼是 相同的時刻。
我是一個路徑 創建往上頂。
現在我打電話 async.series。
因此，異步庫，它是 只是一個庫，它允許您
通過提高或通常的 函數被調用1
之後，對方只是來樣 避免壓痕問題，
而真的只是精神 這將必然出現焦慮
當你第​​一次至少 潛水在這個你自己
與異步編程。
正如在一旁，如果你已經採取 161，你已經處理了鎖
和提高的條件和所有 的是，異步代碼
和喜歡的環境 node.js的實際上是多，
更簡單的說是
比實際編寫 多線程代碼。
任何時候你有 多線程的代碼，
你有加薪的條件。
你不必擔心 包含兩個線程
用相同的資源 磁盤或內存。
JavaScript的美
在node.js的是有 從字面上只有一個線程，
這意味著該瀏覽器
或服務器只能 做一件事一次。
這只是你的， 程序員
保持心理模型 那種你怎麼排隊的事
並找出如何 為了你的代碼。
但你永遠不必擔心 關於提高條件
在中以同樣的方式 至少有這樣的原始代碼。
所以，這是一個有點 很難在這裡grack。
但是 - 讓我打開 本文檔只是一瞬間。
該async.js庫， 同樣是非常googleable，
它生活在GitHub上 repot像他們中的很多。
不要認為這是 粗略的，事實並非如此。
讓我向下滾動 在讀我這裡。
因此，異步庫 提供了一大堆
的它裡面的方法。
例如，有 一個叫每個方法，
其中，如果我點擊這個剛 看到它的文檔了片刻，
這是一個函數或方法 它允許你做一些事情
像各四個 但是在平行。
他們都將要發生 可能在平行。
和每個方法只 要返回給你當所有
的迭代完成。
所以也許它們發生 一前一後。
理想情況下，它們發生 基本上平行。
但該方法不 給你回電話。
它不會你的嗡嗡聲 蜂鳴器，直到所有
有元素的 遍歷已完成。
因此，它只是一個很好的方式
避免使用 一個簡單的四迴路
但實際上做 異步的東西。
但現在更直接 與此相關的示例中，
注意到有這個 系列方法。
並讓我拉了一個 簡單的典型的例子。
因此，異步庫，系列 作為隱含的方法需要在
由方括號中的數組。
什麼是數據 種元素的
在這種基於陣列 一個簡單的例子嗎？
這是函數數組。
因此，在C中，你會打電話 這些函數指針。
在JavaScript中，有更多的 正確對函數的​​引用
或匿名函數。
而這只是意味著，數組
當然是有序的 從零就到了。
所以，他們一直保持 這是很好的訂單
對於一個系列，“事業系列 當然手段做一些事情
為了不平行。
所以，這也就意味著，這 函數將被執行，
那麼這個人，那麼這 之一，這一個，那麼這個人，
然而，許多有
終於等到了可選 回調函數被調用。
所以，請注意這裡的範例。
即使這 是一個人的圖書館，
它代表的 很常見的JavaScript範例
使用回調的一次。
所以，注意你在這裡做。
在所述第一功能是 通過這個數組傳遞，
你定義一個匿名 函數只是用功能。
但是請注意，顯然 根據該文件，
匿名函數應該 帶參數的回調。
這將是一個指針 或引用的函數
你應該叫你的時候 代碼是準備返回一個值。
如此反复，不像只是 典型的過程化編程
在那裡你已經習慣了 立即返回值
一個差與 使用庫這樣的
在異步編程的更多 通常，當你準備好
從返回一個值 一個數據庫，從文件，
從算術 表達，它是由你
調用回調函數。
而最妙的 關於這個庫
如果我們閱讀文檔 更仔細的是，
當且僅當所有的 所謂的回調區域
沒有錯誤的對象， 將整個事情成功嗎？
所以，換句話說， 如果有2個，
如果有10個匿名 功能
在這個數組，因此 在這個系列中，
只有當所有的人都成功了，
將最後的可選回調 被認為是成功的？
如果它們中的任何 失敗，每一個功能
以後也不會 甚至被執行。
因此，它是那種一個很好的方式 具有菊花鏈
即提前中止 如果出現錯誤。
所以看到此背景下，這裡 是我們如何重新實現
，以前的程序。
我像以前那樣得到的路徑， 所以這是比較容易的部分。
我複製粘貼此框架代碼
從那裡的文件 async.series開括號，
打開方括號。
現在發現我有一個 在這個開始函數
第二，我們會看到 我們去哪裡來源於此。
現在發現，這是一個 有點複雜在第一
但只集中在 它一行行。
Fs.stat手段取​​得統計 或者說路徑什麼不​​可以。
調用此回調準備時。
這個代碼是和以前一樣。
如果有錯誤， 還有一個區別吧。
再次，很常見的範例 在node.js的編程
如果出現錯誤， 回調需要知道
按照慣例，第一 參數傳遞給回調函數是怎麼回事
是否定的，如果一切正常或 引用到一個錯誤的對象，
資本E.這就像一個錯誤 存在全局類
但更多的 一些其他的時間。
因此，通過這樣做，如果有一個 錯誤，有什麼寓意？
以及基於我 說該系列呢，
是，如果任何事情都會發生 樣的錯，我們只是想
中止整個系列 匿名函數調用。
因此，它足以讓我 只是返回的回調傳遞
在Error對象。
因為如果統計得到 我回一個錯誤，
我可以創建一個新的 我自己的錯誤對象，
但我真的不關心，
我只是想通過什麼的 錯誤是實際發生的
這樣我就可以把它傳遞 此回調。
而僅僅是明確的，在 返回不是絕對必要的。
我基本上要做到這一點 但我想現在做“返回;
/ /使沒有更多 這裡的代碼執行“。
所以，再一次另一種常見的 約定在JavaScript中，
即使你不是 返回一個值本身，
你想傳遞的價值 回調函數
但你要 停止執行
你的函數的 中，瑣碎的方式
要做到這一點僅僅是 調用返回這裡。
不過也沒什麼不好，
我們只是在做回調回報 錯誤，即使它是怎麼回事
返回未定義的值。
好吧，這不 最有可能的返回值。
我所關心的是 登機進一步執行。
所以，我的這些混為一談 兩行只是一個造型師
到約定只是為了 有行數
的代碼，我只是寫 從2到1。
那麼還有什麼？
如果有不是一個錯誤 -
其實要清楚 我也可以避免
通過這樣做，如果其他人。
但同樣，另一 常見的模式是檢查
為你的錯誤往上頂，然後 剛剛返回，而不是繼續
縮進與您的代碼 偷別人的和偷別人的和偷別人的。
所以，如果它不是一個 文件，現在，你知道，
我想處理這 有點特別。
所以在這裡就像在Java或C + + 或幾個其他語言，
這裡是如何能夠實例化一個 反對輸入錯誤傳遞
在默認消息 不是一個文件
而這僅僅是 有些武斷。
但是我的信號 我自己的錯誤。
而這是什麼最後 線大概意味著什麼？
一切都很好。
如果傳入null作為 錯誤的參數，那只是意味著
按照慣例，一切都很好。
那麼，這意味著什麼 在邏輯上發生的呢？
如果傳遞null 回調
這意味著這個匿名 功能已成功
可以這麼說。
那麼，又該系列 方法之前和現在做的一個基於
早先我的言語定義？
[無聲備註]
移動到下一個，對不對？
如果它返回一個非空 價值，它只是中止
並沒有更多的匿名 函數將被調用。
但因為它有沒有，然後 這將讓接下來的調用。
所以，在這裡的邏輯是 幾乎和以前一樣
我們將看到如何清潔 這進一步上升的時刻。
我意識到這是一種很多
吸收所有口頭 而視。
但是現在發現，第二 我想匿名函數
在系列執行是 試圖讀取該文件。
調用此回調 當你準備好。
如果有錯誤，只是 通過回調方式信號，它
使其餘 這東西中止。
否則返回NULL。
但為什麼我路過 在兩個參數？
嗯，這時候如果我讀 該文件並取回
作為一個變量稱為數據，
我想不僅意味著 一切都很好，通過返回null
第一個參數。
我想回到實際 數據作為第二個參數。
因為如果我繼續讀下去 在文檔，
注意代碼的最後一塊 方括號表示這就是
該系列的結尾。
當時只有兩個匿名 功能在這個系列。
如果這裡有一個錯誤，然後 我知道其中一個鏈接
在這條產業鏈等等 講失敗。
所以，換句話說，這個錯誤 將是一個錯誤的對象
這是空如有 這些人失敗了。
如果是這樣的話，我只是 要擺脫困境，我要去
說400的 是指請求失敗，
這是非常通用 錯誤消息。
然後，我要去 打印出錯誤信息。
所以，我沒有打擾到 是超級肛門這個時候，
我不會分辨 間500和404和403，
我正中下懷 一味地揮揮手
並說出事了。
但如果沒有確實出問題，
我要送這個 res.end通過這個數據。
現在，這看起來有點神秘。
但同樣，如果我讀 文檔，
第二個參數 這最後的，最終的回調，
這只是執行的傢伙 一旦該系列完成
執行或部分有 的，這將是一個數組
所有的第二個參數的
已傳遞 回調。
現在，事實證明， 只在這個系列鏈接
實際上返回到第二 參數是這個這裡。
所以，我要進行排序的上 信仰的飛躍簡單地使用假設
對於那一刻起， 最後是方法
，讓您的​​最後一個 數組的元素。
因為這個數組 這是正在傳遞
我有兩個序號為， 零和1。
這只是零沒有價值 因為這傢伙返回 -
不通過在第二 的說法，但這個傢伙的確。
所以導致支架 零是什麼，
結果支架1 包含什麼，
如果你一直在關注 沿到這一點？
該文件，你好， 世界上大概的內容，
所以這實際上是怎樣我 打印。
並讓我完成 一個細節在這裡。
如果我做這樣的老 學校，如果我想獲得
在最後一個元素，如果我能 這樣做的結果[results.length-1]，
這是排序的 老派的方式
訪問最後一個元素 在 - 或零的索引數組。
但作為在身邊，記得 我有這個庫
在這裡下劃線它通過 會議就被稱為
從字面上下劃線 性格是不是特別的，
它只是看起來像酷 美元符號確實為jQuery。
這僅僅是一個幫手 方法強調最後點
這不正是 同樣的事情。
如果你從來沒有使用過 前強調這兩個JS
對於客戶端編碼
和服務器側是 奇妙有用的庫
描述盡可能多的人 它像jQuery包含了所有
的方法，人們希​​望 附帶的JavaScript本身。
確定。
>>所以，喜歡漂亮的我， 我在看的系列，
你有像回調 作為參數？
>>是的。
>>像這樣，當你 推，在實際上喜歡，
和喜歡有什麼關係呢 意思是當你不得不
像回調，然後像做 -
[無聲備註]
>> OK，好問題。
所以，讓我拉起 這裡異步主頁
或GetHub的文檔。
因此，這是典型 結構。
如果你正在使用電話本 具體方法系列，
有兩個大的部分給它。
一個是一個數組 匿名函數
和2是一個最終的回調 功能，這實際上
在非常執行 該系列的結尾。
現在，如果我們放大一 在第一次靠近一點
那些大的東西， 匿名函數數組
按這一要求 傢伙的文檔中有
為匿名 函數，它接受
在一個參數叫做回調 或者foo或bar，也沒關係
但他的回調調用它。
這是那種你蜂鳴器 那搖小屋交給你。
這是通過何種方式 你可以返回一個值
客戶因為你 不能只是從字面上返回。
你必須這樣做 這個回調的方式。
因為如果這裡面 函數是一些運行緩慢
像數據庫查詢代碼，讀取 從文件系統中的文件，
你不想在那裡等候 並阻止其他人一樣，
你想調用回調。
所以，這是字面上 該參數的名稱。
但像在C中，你 有函數指針。
在Java中你有 參考系統的方法
和同在這裡的JavaScript。
這是一個變量，但 它的類型是函數。
因此，簡單地通過寫它的名字 無論是回調還是富
或酒吧，然後左括號 和右括號，
您執行的 在該功能。
並通過一個空的 指空的錯誤和一個
這意味著這是 我想通過數據英寸
然後將大塊予以明確， 這又是一個回調。
並且它不叫回調，
它只是在概念上是一個 回調函數的方法
因為它被稱為 根據定義
筆者的圖書館時， 整個系列已經完成
或其子集，如果一個 錯誤已經發生更早。
因此，回調函數的名稱， 調用的回調函數，
回調函數的名稱， 調用的回調函數，
不同的回調 功能都在一起。
>>我們現在有像 定義回調？
>>沒有，因為這傢伙 將傳遞到你的數組
匿名函數，
一個指向代碼 他想要執行。
沒錯，所有的權利。
所以，請說， 代碼變得有點簡單。
因此，它可以。
如果你像我一樣，採取 舒適的至少知道，
它需要一段時間來 習慣了這一點。
但是，我們可以清理 這件事一點點，
不要把太多的你 但這裡的另一個變化
和其使用另一種方​​法
在同一個庫 所謂的瀑布。
其中的好處是 不同系列，其中每個
這些匿名的 功能基本上執行
獨立 每個人的。
瀑布好像是這個名字暗示 讓最上面的功能
以一種傳遞價值 到較低的功能，
有點像水小瀑布。
所以在此上側 是，我能種
的使用這個對我有利。
在async.waterfall， 注意以下內容。
我可以叫fs.stat 通過在路徑中
我想獲得 對統計數據。
還沒等我這才想起 有一個匿名函數
這有兩個參數犯錯，
esults然後我打電話給 回調函數手動？
換句話說就是剛需 清楚，記得前面
在異步2，我做了所有 這個討厭的工作。
我叫fs.stat通過在P，
宣布我自己匿名 功能。
然後我檢查，如果錯誤是 不為null，則我這樣做，
否則我這樣做，整個 以下約定美容
像node.js的是，回調 在一般功能都是為了
至少需要一個參數， Error對象後面的零
或更有用的價值。
所以，注意這裡的範例，
這個回調函數我 聲明如下完全
範式，這傢伙的 異步庫做。
這是說這個，為什麼我 我實現我自己的回調
方法時，這個作者 庫字面上遞過​​來
放在盤子裡這麼說，一 回調函數可以使用嗎？
所以，我可以通過在 引用他給了我
使緊隨， 我的幾行
代碼變成一行代碼。
現在，你在哪裡，我們一起去嗎？
接下來的功能 我想執行，
接下來匿名 在這個數組函數
函數執行以下操作。
通知第一統計是 第一個參數。
因此就必須 已經改變了。
現在，這傢伙誰 寫的庫 -
而我要說的傢伙 因為它是一個人。
這傢伙是誰寫的這個庫 為保證文檔
如果此功能在這裡 通過我回一個Error對象
或者為null隨後昏迷 其他值分隔的列表，
他將確保那些 其他值是手
這個匿名函數 為了從左邊到右邊。
而曾經被認為是一個剛 回調函數只是單獨
成為最後一個這樣的說法。
現在，我不知道我是誰 重點只是你知道的。
但現在，有什麼 帶走嗎？
所以，我們知道，從 文檔
或先有幾個例子
這fs.stat最終預計 有兩個參數的回調，
Error對象這是一個 Error對象或空跟著
通過引用的統計對象。
所以，如果我想的是， Error對象昏迷狀態對象，
適合的範式 這個人的圖書館。
所以，我可以簡單地說，因為 我沒有第二個參數
它的 - 這是怎麼回事 由fs.stat傳遞
回調是犯錯，統計 這個庫的定義，
我可以把第二 此參數的名稱
或什麼的，我可以將其重命名
如果我想跟著 通過這裡的回調。
所以，我可以傳遞一個 從這裡珍惜在這裡。
現在，所有這些代碼雖然 誠然，略帶神秘的是
至少複製粘貼的 在大多數情況下從之前。
唯一的區別是通知 我在這裡聲明了一個錯誤
反對，現在我想 變得有點票友。
其實我是想知道什麼 錯誤是，所以我要去
掖此對象的內 財產隨意調用的代碼
讓我知道， 這不是一個文件
這應該是未經授權的， 這是一個HTTP 403。
我記得之前 我通過Error對象
回調。
然後最後嘗試讀取 該文件中，所以在這種情況下，
瀑布，我已經打破 從兩個大的步驟代碼
分成三個較小的步驟。
請注意這裡的美麗，
我可以打電話fs.readFile 傳遞的路徑。
再困難的部分 精神上，我是剛剛經過
在那傢伙的回調。
他遞過來的東西，我 要傳遞給fs.readFile。
因為我們都秉承 以相同的約定，
第一個參數傳遞給回調 其次Error對象或空
由昏迷或分居 有用的東西的清單。
那麼，這意味著什麼現在，如果我 看我就知道文檔
這一點，最後的回調， 這傢伙在這裡外
方括號是怎麼回事 在Error對象傳遞
或者為null，我應該檢查 一如既往地與這裡的代碼。
然後通過定義 這種方法的
在那傢伙的文檔， 返回的最後一個值
從最後一個方法 在我的匿名數組 -
我的數組的匿名函數。
那麼，什麼是讀取文件的回報
和我使用一個返回 現在寬鬆。
我的意思是什麼閱讀 文件作為參數傳遞
回調方法 它的霸道？
兩個參數，第一個是 Error對象或為空，
這幾乎總是 將是答案。
第二件事是怎麼回事 是什麼讀文件？
該文件的內容， 數據正如我們前面的說法。
因此，通過簡單地聲明 錯了，結果，
並檢查這個錯誤 排序是無聊了。
否則，我做res.end 傳遞這一結果。
這無疑將 不同步的完美
直到你真正 把它寫自己。
但現在，拿 相差至少事實
有顯然這 常見的範式，即如果我們
和庫的作者 所有排序棒
本公約 的回調方法。
和第一個參數是 Error對象或者為null。
並且在第二和第三
和第四對象是事物 我們關心我們的排序
遵循規則和 文檔。
我們開始與代碼 誠實是很醜陋。
並且，即使最新的 舉例來說簡直是一場有點難
環繞你的頭腦， 它至少在視覺上，
看起來像它的嚴格得多。
一旦你得到舒適 有了它，它是如此容易得多
和它的這麼多不容易 錯誤比前面的例子。
所以，讓我展示 這裡還有最後一件事。
這是三門版。
和 - 不，讓我們離開 獨此一家。
讓我走進一對夫婦 其他最後事情玩笑。
好吧，所以在服務器2。
確定。首先，有任何疑問， 我知道這是很多
但你想要更多 指令，所以？
你沒有說好 指令必然。
是嗎？
[無聲備註]
正確的，你基本上 寬鬆的操作系統
弄清楚如何玩雜耍 所有這些球的一次，
從文件中讀取， 讀取數據庫。
而且它是這個服務器的JavaScript 本身是單線程的。
而且基本上，實際上，
有一個畫面 我沒吐了，
它不一定 所有的啟發
但也許我們會給 你的心理模型。
JavaScript的本身和節點
特別是有這個 所謂的事件循環。
據此，可以認為 node.js的，程序，
簡直是像 一個無限循環。
這只是一個野生循環，等待 等待，等待，
尋找任務來完成。
並且該任務可能，去 從數據庫中獲取的東西
或者這裡是從一個值 數據庫或去獲得這個文件
從磁盤或這裡有一個 來自用戶的請求。
任何類型的事件，就像 瀏覽器事件驅動的，
所以作為服務器 端事件驅動的。
而這些東西 構成事件。
所以有人在node.js的，只是 寫了一個無限循環，
一個大的野生循環，等待 對於東西的事情發生。
而作為東西確實發生，它 結束了在一個隊列，對不對？
當然，數據庫 可能會返回一個值。
和一個文件系統中，操作 系統會返回一個值
在大致相同的時間 但有可能將
要訂購一些給他們。
和node.js的是要 有本質上是一個隊列
就像一個大數組或 載體中，一些數據結構
這所有的緩衝 這些事情。
因為它可以從字面上只 在一個時間處理它們中的一個。
所以，當你的開發人員，
編寫異步的JavaScript 使用異步代碼
功能，你允許這個 所謂事件循環去
下一個滴答，對不對？
所以，你長緊隨 返回所有
這些異步方法 不喜歡讀文件和統計，
他們立即返回 因為最終回調
回來。
只要你回來，
這意味著別人可以 得到彈出的股票在這裡
或者，它可以得到彈出 在這裡該隊列的前面。
因此，有一個在 事實上序列化
，的一切是怎麼回事
即使所有這些東西 可以並行發生的
在多線程系統。
但Node.js的本身 服務器正在運行
作為一個線程。
並認為不好的一面是 噸你不一定最大
您的計算機的 能力是作為特別
如果你有一個16芯或 即使是2核電腦
而你只是運行 節點的一個實例。
但是，如果你已經再次 採取類似161，
你避免了巨大的噩夢 當談到頭痛
比賽條件和 鎖和信號量
和寫作真正的 多線程的代碼，
所以積極以及不利的缺點。
確定。所以，回到這裡的代碼， 讓我提議，我們首先
簡化的東西一點點。
我們看到服務器一個有點 前看起來像這樣。
所以，這可以說是 很簡單。
但就像世界 PHP的，有框架
像Laravel並有 事情，比如Rails和Django的，
同樣的事情在node.js的世界。
我們會花更多的 時間在這週三
並在接下來的項目。
但是，如果我進入一個 服務器2目錄，
這裡需要注意的幾個範例。
因此，這是 - 有去 是等效的例子
但它的使用 框架稱為express.js，
這是免費的開源 軟件就像Rails和Django的，
像Laravel，這是 只是最終將
今天是賞識 因為我們已經寫
這種簡單的例子。
但請相信我們。
這將非常迅速 成為你的朋友
因為這將節省 你很多的TDS代碼。
和一個共同的範式 一個express.js應用
有一個app.js或server.js 文件，其中包含的邏輯
你的程序或 至少在入口點。
你可以有多個文件。
節點模塊子目錄 其中有庫
你已經下載了 像異步
並表示自己在別人。
然後的package.json， 的package.json看起來是這樣的，
您可以手動創建它 或工具為您創建它
它是名副其實的JSON文件
而有趣的部分 是這裡的依賴性。
就像在Laravel，你 有這樣的供應商目錄
而你不得不擔心 關於包裝和做 -
與實際更新 工匠或類似的命令，
庫你 已經安裝了，
同樣用的package.json這裡 而你管理的庫
和版本 你關心。
所以，如果我有一個的package.json， 我可以簡單地做故宮，
節點程序包管理器安裝， 它會自動查找
在那的package.json文件。
看看，看看，我做 有最新版本
所有的模塊供應商
在一個節點中強調模塊 此目錄或可能
在一些家長或 祖先目錄。
如果沒有，它是 要下載它們
你會看到一大堆
HTTP的東西去 跨線。
因此，例如，讓我 告訴你的內容
節點模塊只是為了表達。
讓我繼續前進， 大膽刪除節點模塊
這樣所有我現在是這樣的。
如果我不NPM安裝，你會 看到它會讀取
那的package.json文件和 我們已經看到類似的輸出
這在Laravel世界。
這是一個下載一個整體 一大堆東西，這就是
因為反過來快遞 取決於一大堆
其他國家人民的庫。
因此，所有這些都是那種 下載遞歸。
到現在為止，如果我做的LS再次，
還有我的節點模塊 回目錄
並表示為回。
所以它只是一種方式 簡化的包管理。
現在，如果我們看一下 app.js文件，這是怎麼回事
是一個回歸 我們最早的Web服務器
在這裡我們只是吐 出“你好，世界”。
但這裡要注意的範式，
首先我們需要明確 模塊，那麼我們這行
哪你知道代碼 從文檔。
你從字面上對待那 模塊的變量作為函數，
所以開閉括號 括號意味著執行它。
那將明顯 返回的東西我們要去
通常調用一個應用程序。
它是如何工作的？
我真的不知道。
我會告訴別人，你知道的， 在快遞世界寫的。
我要現在站在 他或她的肩膀上，從而
讓我的應用程序 運行比較簡單。
在這裡，我要聽 該特定端口上
這可能是任何東西。
這裡是代碼的 更讓人想起現在也許
的Laravel和routes.php。
因此，這是簡單的晚飯，我 只是要指定路由
為斜線明星，所以一切 是將要被吸收
這個請求處理程序。
範式的請求處理程序 是它的匿名函數
與請求參數
和響應對象 就像以前一樣。
和res.send快遞方式 你發送的代碼依次
用任何你想發送。
當然，你可以 做一些票友
通過實際發送 文件或HTML
或動態生成的 內容。
但現在，我們所做的 被吐出你好，世界。
如果我們進入服務器3， 這是更炫只是
向您展示一些功能。
我們會告訴你一個 甚至性感版
這週三。
但是，如果你曾經聽說過 插座的IO也許，中
所以我覺得喬納森 或者有人所說，
的事情之一 節點是真正知道
為的是它的實時 行為，對不對？
想想PHP的MySQL中，如果你 為實現一個聊天服務器
在PHP中，由此兩個人可以 打開一個瀏覽器窗口foo.com
然後開始每個IMING 另外，愛麗絲在一個窗口中，
鮑勃在另一個使 他們每個人看到他
或她的消息 其他窗口。
你將如何做到這一點 在PHP和MySQL？
使用或不使用Laravel排序 的微不足道，你可以有
像一個index.php文件。
而且你得有 - 中 某些情況下，它有要吐
出的形式，所以有 將是一個HTML表單
這可能不提交 通過正常的表單提交
但阿賈克斯可能，對不對？
所以，一個提交處理程序，所以 您輸入到一個文本字段，
您按下回車鍵，然後它得到 通過Ajax發送到服務器。
你這是什麼，然後 在服務器上做？
所以，你得的index.php
什麼點PHP的這 在HTTP參數中收到
從用戶，Alice的或者Bob的 即時消息，你該怎麼辦
它以它傳播 給Bob或翹邊，分別是多少？
我的意思是你從字面上 有工具有哪些
在你最小做到這一點。
所以，像你會做什麼？
你有一分鐘的時間 實施這一計劃。
是嗎？
[無聲備註]
完美的。對，所以 你已經有了一個數據庫。
我們知道一點點 關於MySQL位。
所以，你有一個表 這消息，
也許有一個次 戳，用戶ID，
該消息的主體 自己創建的，
更新了與這一切。
所以，你存儲在數據庫中。
並假設Alice發送 第一條消息，那麼，乙怎樣得到
現在消息 從數據庫中？
>>這可能是一些Ajax 響應的持續不斷
回數據庫 頂部得到[聽不清]。
>>沒錯。
所以Bob的代碼誰的代碼 一樣的愛麗絲只是排序
的對稱關係，
Bob的瀏覽器有一些Ajax代碼 這很可能，也許每30
秒拉 通過Ajax同步服務器，
有沒有新的消息？
是否有新的消息？
每隔30秒會 是種次優
因為他要等待甚至
如果從字面上愛麗絲 剛剛發來的消息。
因此，Bob的瀏覽器可能 每一秒點擊服務器。
但是，這意味著Alice的 瀏覽器傳到了服務器
每一秒。
怎麼樣查理 [假設拼寫]
和大衛[假設拼寫] 和愛德華[假設拼寫]
和所有其他信 字母表中的？
這是什麼問題 這種方法的？
很多命中過度的 -
我的意思是，你只是有效 給藥自己的視線
或DDOSing，分佈式 拒絕服務攻擊
在您自己的網站，讓所有
這些用戶中運行JavaScript 這只是ping命令的代碼
赫克你的服務器 即使任意數量
80％的時間 沒有人說什麼
在聊天室。
但你只是檢查 以確保這樣的。
這麼說PHP在很多 語言只是沒有好
對於實時通訊。
因為在PHP召回有 沒有中央的記憶，對不對？
你有會話對象 創造的假象
中央存儲但 這是基於每個用戶的基礎。
您沒有全局內存 就像你在一個Java Servlet的做
在熟悉的或其他 框架就像那個。
Node.js的是，你確實有 全局內存，因為你有
一台服務器，而“能 記住任何東西就是了
所有的用戶。
而且您可能仍然 有一個數據庫。
但是關於Node.js的的好處 也就是它的好多了
不是像PHP 和創造的幻覺
處理多個 件事情。
而事實上在一旁，你可以 在PHP中實現聊天服務器，
但你通常會做 一些所謂的長輪詢
據此，你就不能ping 服務器每秒。
你ping服務器時， 服務器不響應你
對於30向上 秒，它的字面坐鎮
在循環中等待，等待。
和服務器檢查是否 有一個在數據庫中的新數據
只有一旦你看到的，“哦， 這裡有來自Bob的消息，“
它回复HTP服務器？
因此，在您瀏覽器中的效果 是IE圖標或Mozilla
或什麼的只是不斷紡 30秒的時間。
但好處是，你不 有30個連接請求
在30秒內，你有一個。
因此，它被稱為長輪詢。
但更重要的現代網絡 瀏覽器是一種叫做
WebSocket的，這 你把CS143，
可以有效地使 從客戶端的TCP連接
像瀏覽器到服務器 然後掛到它
不使用近 盡可能多的資源
如HTTP也許傳統做。
和Socket IO是 一個Node.js的庫
這使得它更容易 使套接字連接
或有幻覺 在舊的瀏覽器
這樣就可以實現這個 實時功能的。
所以，這裡是一個例子。
這東西往上頂得到一個 有點複雜
但它主要是複製和粘貼 從socket.io的文檔。
這裡現在是一個更 精確的請求處理程序。
如果用戶請求一個 斜線，我將什麼文件
是顯然 成為了他們呢？
index.html的。
並有一些新的 東西在這裡流
我會告訴你 在短短的一瞬間。
但是，這只是另一種方式
抓住一個文件的 效率更好一點
不僅僅是做fs.readFile。
這是一個有點小聰明 特別是對於大文件。
所以長話短說， 這些行只服務
一個名為index.html文件
這對於現在假設包含 HTML表單由愛麗絲
和Bob可以互通。
最後，io.sockets.on，所以這 來自這條線在這裡。
所以，我只是讀 文檔io.socket給我
獲得了所謂的 WebSocket的一個瀏覽器，
瀏覽器之間 和服務器。
我聽著特別 事件連接的方式
當用戶第一次 打服務器嘗試
打開這個連接，我 要調用這個回調。
而現在，我要去 要做到以下幾點。
每五秒鐘， 什麼，我該怎麼辦？
我要發出或廣播 如果你還記得從無到有，
圖形化語言會 的廣播塊？
所以，你要放出
或觸發稱為事件 從任意服務器。
並且它要 包含消息萍
和當前日期。
所以，這是一個實際的 聊天服務器愛麗絲
和Bob可以使用，但它的排序 一個自動化的聊天服務器
該消息是哪裡 只是有點聲納的偵測。
這只是日期的時間是 被送到每五秒鐘。
所以，如果我真的執行這個 事情 - 這就是它。
要明確到這裡，通知 這只是記錄下來這裡。
所以，讓我轉了 無視這一點。
讓我做app.js.的節點
讓我去我的瀏覽器。
在這裡重新載入主頁。
[暫停]
讓我關閉檢查。
每五秒鐘，我有一個 示範即使不
互動式的，人類
的東西是 發生異步。
在瀏覽器中的通知， 有沒有旋轉圖標。
它使用一個票友功能 Chrome瀏覽器在現代瀏覽器
保持插座的 引擎蓋下方連接
它就是被稱為 一般一個pub / sub模型，
發布/訂閱模型， 在這裡我們還沒有做
這很明確地在這裡。
但是，什麼是好的關於這 一般的pub / sub範式
你可以有一個發布。
在這種情況下 中央服務器和所有
個人 瀏覽器是客戶端。
ALICES和的突然移動 世界可以訂閱它，
這樣你就可以將郵件中繼 其中任意數量的用戶。
而且即使再次我們 沒有看到交互性，
我們有也許12行 代碼只是為了做到這一點。
它可能不是一個飛躍 想像你怎麼可能掀起
出來的index.html文件 有一個真實的HTML表單，
jQuery代碼與點點 阿賈克斯不發送白天
但只是發送任何愛麗絲 或鮑勃類型的服務器
然後服務器 將繼電器出來。
我保證窺 在最後一件事剛
逗你與此有關。
如果我們進入流 零和1，
你會看到代碼，這只是 有一點不同在這裡。
只要你已經看到了， 這是一種替代
到了我叫fs.readFile 前面的方法，即，
你可以告訴node.js的，“去 讀取該文件到內存中。
但如果是大只給 我一大塊的時間。“
你可能會知道，從CS165
或161的文件系統 有不同的
性能。
你可能需要閱讀 以512字節的塊
或2千字節或什麼的。
這是一個優化的方法 找回文件的迭代
這樣就可以吐出來 出一點更快速
到瀏覽器或到 無論誰最終客戶是。
因此，大量的內容 今天我們要潛水
到週三更詳細 與Tim [假設拼寫]
尤其是在看我們如何 能翻譯的一些想法
從第一半 當然Laravel和模型
成庫，他本人 編寫了一個名為Bookshelf.js
這是越來越 在社區流行
因為它可以讓你利用它，
如果不是更 的雄辯功能
這回憶是 Laravel庫的洞察力，
所以更該多如何
發展完全成熟 應用程序在週三。
我們會在您看到呢。