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