摘要:我們給某個方法傳遞了一個函數(shù),這個方法在有相應事件發(fā)生時調用這個函數(shù)來進行回調。當回調啟動,我們的函數(shù)被觸發(fā)的時候,有兩個參數(shù)被傳入和。最后,我們調用完成響應。創(chuàng)建文件并寫入以下內容好了。
我們來把目標設定得簡單點,不過也要夠實際才行:
用戶可以通過瀏覽器使用我們的應用。
當用戶請求http://domain/start時,可以看到一個歡迎頁面,頁面上有一個文件上傳的表單。
1.我們需要提供Web頁面,因此需要一個HTTP服務器
2.對于不同的請求,根據(jù)請求的URL,我們的服務器需要給予不同的響應,因此我們需要一個路由,用于把請求對應3.到請求處理程序(request handler)
4.當請求被服務器接收并通過路由傳遞之后,需要可以對其進行處理,因此我們需要最終的請求處理程序
5.路由還應該能處理POST數(shù)據(jù),并且把數(shù)據(jù)封裝成更友好的格式傳遞給請求處理入程序,因此需要請求數(shù)據(jù)處理功能
————————————————————————————————————————————————
對Node.js來說,使用Node.js時,我們不僅僅在實現(xiàn)一個應用,同時還實現(xiàn)了整個HTTP服務器。事實上,我們的Web應用以及對應的Web服務器基本上是一樣的。
現(xiàn)在我們就來開始實現(xiàn)之路,先從第一個部分--HTTP服務器著手。
那么,現(xiàn)在我們來創(chuàng)建一個用于啟動我們的應用的主文件,和一個保存著我們的HTTP服務器代碼的模塊。
在我的印象里,把主文件叫做index.js或多或少是個標準格式。把服務器模塊放進叫server.js的文件里則很好理解。
讓我們先從服務器模塊開始。在你的項目的根目錄下創(chuàng)建一個叫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);
node server.js
接下來,打開瀏覽器訪問http://localhost:8888/,你會看到一個寫著“Hello World”的網(wǎng)頁。
分析HTTP服務器那么接下來,讓我們分析一下這個HTTP服務器的構成。
第一行請求(require)Node.js自帶的 http 模塊,并且把它賦值給 http 變量。
接下來我們調用http模塊提供的函數(shù): createServer 。這個函數(shù)會返回一個對象,這個對象有一個叫做 listen 的方法,這個方法有一個數(shù)值參數(shù),指定這個HTTP服務器監(jiān)聽的端口號。
咱們暫時先不管 http.createServer 的括號里的那個函數(shù)定義。
我們本來可以用這樣的代碼來啟動服務器并偵聽8888端口:
var http = require("http"); var server = http.createServer(); server.listen(8888);
當我們使用 http.createServer 方法的時候,我們當然不只是想要一個偵聽某個端口的服務器,我們還想要它在服務器收到一個HTTP請求的時候做點什么。
問題是,這是異步的:請求任何時候都可能到達,但是我們的服務器卻跑在一個單進程中。
寫PHP應用的時候,我們一點也不為此擔心:任何時候當有請求進入的時候,網(wǎng)頁服務器(通常是Apache)就為這一請求新建一個進程,并且開始從頭到尾執(zhí)行相應的PHP腳本。
那么在我們的Node.js程序中,當一個新的請求到達8888端口的時候,我們怎么控制流程呢?
嗯,這就是Node.js/JavaScript的事件驅動設計能夠真正幫上忙的地方了——雖然我們還得學一些新概念才能掌握它。讓我們來看看這些概念是怎么應用在我們的服務器代碼里的。
我們創(chuàng)建了服務器,并且向創(chuàng)建它的方法傳遞了一個函數(shù)。無論何時我們的服務器收到一個請求,這個函數(shù)就會被調用。
我們不知道這件事情什么時候會發(fā)生,但是我們現(xiàn)在有了一個處理請求的地方:它就是我們傳遞過去的那個函數(shù)。至于它是被預先定義的函數(shù)還是匿名函數(shù),就無關緊要了。
這個就是傳說中的 回調 。我們給某個方法傳遞了一個函數(shù),這個方法在有相應事件發(fā)生時調用這個函數(shù)來進行 回調 。
當回調啟動,我們的 onRequest() 函數(shù)被觸發(fā)的時候,有兩個參數(shù)被傳入: request 和 response 。
它們是對象,你可以使用它們的方法來處理HTTP請求的細節(jié),并且響應請求(比如向發(fā)出請求的瀏覽器發(fā)回一些東西)。
所以我們的代碼就是:當收到請求時,使用 response.writeHead() 函數(shù)發(fā)送一個HTTP狀態(tài)200和HTTP頭的內容類型(content-type),使用 response.write() 函數(shù)在HTTP相應主體中發(fā)送文本“Hello World"。
最后,我們調用 response.end() 完成響應。
我們把我們的服務器腳本放到一個叫做 start 的函數(shù)里,然后我們會導出這個函數(shù)。
var http = require("http"); function start() { function onRequest(request, response) { console.log("Request received."); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start;
創(chuàng)建 index.js 文件并寫入以下內容:
var server = require("./server"); server.start();
好了。我們現(xiàn)在就可以從我們的主要腳本啟動我們的的應用了,而它還是老樣子:
node index.js
非常好,我們現(xiàn)在可以把我們的應用的不同部分放入不同的文件里,并且通過生成模塊的方式把它們連接到一起了。
處理不同的HTTP請求在我們的代碼中是一個不同的部分,叫做“路由選擇”——那么,我們接下來就創(chuàng)造一個叫做 路由 的模塊吧。
如何來進行請求的“路由”
我們要為路由提供請求的URL和其他需要的GET及POST參數(shù),隨后路由需要根據(jù)這些數(shù)據(jù)來執(zhí)行相應的代碼(這里“代碼”對應整個應用的第三部分:一系列在接收到請求時真正工作的處理程序)。
因此,我們需要查看HTTP請求,從中提取出請求的URL以及GET/POST參數(shù)。這一功能應當屬于路由還是服務器(甚至作為一個模塊自身的功能)確實值得探討,但這里暫定其為我們的HTTP服務器的功能。
我們需要的所有數(shù)據(jù)都會包含在request對象中,該對象作為onRequest()回調函數(shù)的第一個參數(shù)傳遞。但是為了解析這些數(shù)據(jù),我們需要額外的Node.JS模塊,它們分別是url和querystring模塊。
現(xiàn)在我們可以來編寫路由了,建立一個名為router.js的文件,添加以下內容:console.log("About to route a request for " + pathname); } exports.route = route;```
var http = require("http");
var url = require("url");
function start(route) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname; console.log("Request for " + pathname + " received."); route(pathname); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start = start;`
同時,我們會相應擴展index.js,使得路由函數(shù)可以被注入到服務器中:
var router = require("./router"); server.start(router.route);
就像這樣,我們傳遞一個東西,然后服務器利用這個東西來完成一些事。嗨那個叫路由的東西,能幫我把這個路由一下嗎?
但是服務器其實不需要這樣的東西。它只需要把事情做完就行,其實為了把事情做完,你根本不需要東西,你需要的是動作。也就是說,你不需要名詞,你需要動詞。
理解了這個概念里最核心、最基本的思想轉換后,自然而然地理解了函數(shù)編程
詳情參考https://www.nodebeginner.org/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89157.html
摘要:最近利用空閑時間寫了一個從入門到上線的的實戰(zhàn)教程從入門到上線目前還在更新中,入門篇已基本成型。本項目使用語法,采用搭建了一個博客系統(tǒng),實現(xiàn)了文章管理用戶登錄注冊權限控制分類管理等功能。實現(xiàn)線上部署左手代碼右手磚拋磚引玉 最近利用空閑時間寫了一個從入門到上線的的node實戰(zhàn)教程《Node.js從入門到上線》A blog build with Koa2. 目前還在更新中,入門篇已基本成型。...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:本文源碼簡介之前剛入門并做好了一個簡而全的純全家桶的項目,數(shù)據(jù)都是本地模擬請求的詳情請移步這里為了真正做到數(shù)據(jù)庫的真實存取,于是又開始入門了并以此來為之前的頁面寫后臺數(shù)據(jù)接口。 本文源碼:Github 簡介: 之前剛入門vue并做好了一個簡而全的純vue2全家桶的項目,數(shù)據(jù)都是本地 json 模擬請求的;詳情請移步這里:vue-proj-demo 為了真正做到數(shù)據(jù)庫的真實存取,于是又...
摘要:是一個針對網(wǎng)絡應用開發(fā)的平臺它基于的運行時引擎但它不僅僅只是的標準類庫是它非常重要的一部分它涵蓋了從服務端到同步或者異步的文件管理已經迅速成為一個可行并且真正高效的開發(fā)平臺在誕生之前在服務端運行是件不可思議的事情并且對其他腳本語言來說要實現(xiàn) Node是一個針對網(wǎng)絡應用開發(fā)的平臺,它基于Google的JavaScript運行時引擎V8,但它不僅僅只是V8.Node的標準類庫是它非常重要的...
閱讀 2898·2021-11-23 09:51
閱讀 3412·2021-11-22 09:34
閱讀 3315·2021-10-27 14:14
閱讀 1519·2019-08-30 15:55
閱讀 3351·2019-08-30 15:54
閱讀 1075·2019-08-30 15:52
閱讀 1895·2019-08-30 12:46
閱讀 2854·2019-08-29 16:11