2020-03-01--node學(xué)習(xí)

API(Application Programming Interface,應(yīng)用程序接口)是一些預(yù)先定義的函數(shù)在岂,或指軟件系統(tǒng)不同組成部分銜接的約定慢味。 目的是提供應(yīng)用程序與開(kāi)發(fā)人員基于某軟件或硬件得以訪問(wèn)一組例程的能力,而又無(wú)需訪問(wèn)原碼汰蜘,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)辑奈。

函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)苛茂。


創(chuàng)建 Node.js 應(yīng)用

步驟一已烤、引入 required 模塊
我們使用 require 指令來(lái)載入 http 模塊,并將實(shí)例化的 HTTP 賦值給變量 http妓羊,實(shí)例如下:

var http = require("http");

步驟二胯究、創(chuàng)建服務(wù)器
接下來(lái)我們使用 http.createServer() 方法創(chuàng)建服務(wù)器,并使用 listen 方法綁定 8888 端口躁绸。 函數(shù)通過(guò) request, response 參數(shù)來(lái)接收和響應(yīng)數(shù)據(jù)裕循。

實(shí)例如下,在你項(xiàng)目的根目錄下創(chuàng)建一個(gè)叫 server.js 的文件净刮,并寫(xiě)入以下代碼:

var http = require('http');

http.createServer(function (request, response) {

    // 發(fā)送 HTTP 頭部 
    // HTTP 狀態(tài)值: 200 : OK
    // 內(nèi)容類型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 發(fā)送響應(yīng)數(shù)據(jù) "Hello World"
    response.end('Hello World\n');
}).listen(8888);

// 終端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

以上代碼我們完成了一個(gè)可以工作的 HTTP 服務(wù)器剥哑。

使用 node 命令執(zhí)行以上的代碼:

node server.js
Server running at http://127.0.0.1:8888/
創(chuàng)建node應(yīng)用

接下來(lái),打開(kāi)瀏覽器訪問(wèn) http://127.0.0.1:8888/淹父,你會(huì)看到一個(gè)寫(xiě)著 "Hello World"的網(wǎng)頁(yè)株婴。


hellow world 網(wǎng)頁(yè)

分析Node.js 的 HTTP 服務(wù)器:

第一行請(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)。

使用 npm 命令安裝常用的 Node.js web框架模塊 express

$ npm install express
安裝express模塊

Package.json 屬性說(shuō)明

name - 包名捡鱼。
version - 包的版本號(hào)。
description - 包的描述酷愧。
homepage - 包的官網(wǎng) url 驾诈。
author - 包的作者姓名。
contributors - 包的其他貢獻(xiàn)者姓名溶浴。
dependencies - 依賴包列表乍迄。如果依賴包沒(méi)有安裝,npm 會(huì)自動(dòng)將依賴包安裝在 node_module 目錄下士败。
repository - 包代碼存放的地方的類型闯两,可以是 git 或 svn,git 可在 Github 上谅将。
main - main 字段指定了程序的主入口文件漾狼,require('moduleName') 就會(huì)加載這個(gè)文件。這個(gè)字段的默認(rèn)值是模塊根目錄下面的 index.js饥臂。
keywords - 關(guān)鍵字

卸載模塊
我們可以使用以下命令來(lái)卸載 Node.js 模塊逊躁。

$ npm uninstall express

卸載后,你可以到 /node_modules/ 目錄下查看包是否還存在隅熙,或者使用以下命令查看:

$ npm ls

更新模塊
我們可以使用以下命令更新模塊:

$ npm update express

搜索模塊
使用以下來(lái)搜索模塊:

$ npm search express

NPM 常用命令

除了本章介紹的部分外稽煤,NPM還提供了很多功能核芽,package.json里也有很多其它有用的字段。

除了可以在npmjs.org/doc/查看官方文檔外酵熙,這里再介紹一些NPM常用命令轧简。

NPM提供了很多命令,例如install和publish匾二,使用npm help可查看所有命令吉懊。

  • NPM提供了很多命令,例如installpublish假勿,使用npm help可查看所有命令借嗽。

  • 使用npm help <command>可查看某條命令的詳細(xì)幫助,例如npm help install转培。

  • package.json所在目錄下使用npm install . -g可先在本地安裝當(dāng)前命令行程序恶导,可用于發(fā)布前的本地測(cè)試。

  • 使用npm update <package>可以把當(dāng)前目錄下node_modules子目錄里邊的對(duì)應(yīng)模塊更新至最新版本浸须。

  • 使用npm update <package> -g可以把全局安裝的對(duì)應(yīng)命令行程序更新至最新版惨寿。

  • 使用npm cache clear可以清空NPM本地緩存,用于對(duì)付使用相同版本號(hào)發(fā)布新版本代碼的人删窒。

  • 使用npm unpublish <package>@<version>可以撤銷發(fā)布自己發(fā)布過(guò)的某個(gè)版本代碼裂垦。

Node.js REPL(交互式解釋器)

Node.js REPL(Read Eval Print Loop:交互式解釋器) 表示一個(gè)電腦的環(huán)境,類似 Window 系統(tǒng)的終端或 Unix/Linux shell肌索,我們可以在終端中輸入命令蕉拢,并接收系統(tǒng)的響應(yīng)。

Node 自帶了交互式解釋器诚亚,可以執(zhí)行以下任務(wù):

讀取 - 讀取用戶輸入晕换,解析輸入了Javascript 數(shù)據(jù)結(jié)構(gòu)并存儲(chǔ)在內(nèi)存中。
執(zhí)行 - 執(zhí)行輸入的數(shù)據(jù)結(jié)構(gòu)
打印 - 輸出結(jié)果
循環(huán) - 循環(huán)操作以上步驟直到用戶兩次按下 ctrl-c 按鈕退出站宗。

Node 的交互式解釋器可以很好的調(diào)試 Javascript 代碼闸准。

多行表達(dá)式
Node REPL 支持輸入多行表達(dá)式,這就有點(diǎn)類似 JavaScript梢灭。接下來(lái)讓我們來(lái)執(zhí)行一個(gè) do-while 循環(huán):

$ node
> var x = 0
undefined
> do {
... x++;
... console.log("x: " + x);
... } while ( x < 5 );
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
>

... 三個(gè)點(diǎn)的符號(hào)是系統(tǒng)自動(dòng)生成的夷家,你回車換行后即可。Node 會(huì)自動(dòng)檢測(cè)是否為連續(xù)的表達(dá)式敏释。


多行表達(dá)式

下劃線()變量
你可以使用下劃線(
)獲取上一個(gè)表達(dá)式的運(yùn)算結(jié)果:

$ node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>
下劃線(_)變量

REPL 命令

ctrl + c - 退出當(dāng)前終端库快。
ctrl + c 按下兩次 - 退出 Node REPL。
ctrl + d - 退出 Node REPL.
向上/向下 鍵 - 查看輸入的歷史命令
tab 鍵 - 列出當(dāng)前命令
.help - 列出使用命令
.break - 退出多行表達(dá)式
.clear - 退出多行表達(dá)式
.save filename - 保存當(dāng)前的 Node REPL 會(huì)話到指定文件
.load filename - 載入當(dāng)前 Node REPL 會(huì)話的文件內(nèi)容颂暇。

Node.js 回調(diào)函數(shù)

Node.js 異步編程的直接體現(xiàn)就是回調(diào)缺谴。

異步編程依托于回調(diào)來(lái)實(shí)現(xiàn),但不能說(shuō)使用了回調(diào)后程序就異步化了。

回調(diào)函數(shù)在完成任務(wù)后就會(huì)被調(diào)用湿蛔,Node 使用了大量的回調(diào)函數(shù)膀曾,Node 所有 API 都支持回調(diào)函數(shù)。

例如阳啥,我們可以一邊讀取文件添谊,一邊執(zhí)行其他命令,在文件讀取完成后察迟,我們將文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)返回斩狱。這樣在執(zhí)行代碼時(shí)就沒(méi)有阻塞或等待文件 I/O 操作。這就大大提高了 Node.js 的性能扎瓶,可以處理大量的并發(fā)請(qǐng)求所踊。

回調(diào)函數(shù)一般作為函數(shù)的最后一個(gè)參數(shù)出現(xiàn):

function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }

阻塞代碼實(shí)例
創(chuàng)建一個(gè)文件 input.txt ,內(nèi)容如下:

菜鳥(niǎo)教程官網(wǎng)地址:www.runoob.com

創(chuàng)建 main.js 文件, 代碼如下:

var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序執(zhí)行結(jié)束!");

以上代碼執(zhí)行結(jié)果如下:

$ node main.js
菜鳥(niǎo)教程官網(wǎng)地址:www.runoob.com
程序執(zhí)行結(jié)束!

非阻塞代碼實(shí)例
創(chuàng)建一個(gè)文件 input.txt 概荷,內(nèi)容如下:

菜鳥(niǎo)教程官網(wǎng)地址:www.runoob.com

創(chuàng)建 main.js 文件, 代碼如下:

var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});
console.log("程序執(zhí)行結(jié)束!");

以上代碼執(zhí)行結(jié)果如下:

$ node main.js
程序執(zhí)行結(jié)束!
菜鳥(niǎo)教程官網(wǎng)地址:www.runoob.com

以上兩個(gè)實(shí)例我們了解了阻塞與非阻塞調(diào)用的不同秕岛。第一個(gè)實(shí)例在文件讀取完后才執(zhí)行程序。 第二個(gè)實(shí)例我們不需要等待文件讀取完误证,這樣就可以在讀取文件時(shí)同時(shí)執(zhí)行接下來(lái)的代碼继薛,大大提高了程序的性能。

因此愈捅,阻塞是按順序執(zhí)行的遏考,而非阻塞是不需要按順序的,所以如果需要處理回調(diào)函數(shù)的參數(shù)蓝谨,我們就需要寫(xiě)在回調(diào)函數(shù)內(nèi)灌具。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者像棘。
  • 序言:七十年代末稽亏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缕题,更是在濱河造成了極大的恐慌,老刑警劉巖胖腾,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烟零,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡咸作,警方通過(guò)查閱死者的電腦和手機(jī)锨阿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)记罚,“玉大人墅诡,你說(shuō)我怎么就攤上這事⊥┲牵” “怎么了末早?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵烟馅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我然磷,道長(zhǎng)郑趁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任姿搜,我火速辦了婚禮寡润,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舅柜。我一直安慰自己梭纹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布致份。 她就那樣靜靜地躺著变抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪知举。 梳的紋絲不亂的頭發(fā)上瞬沦,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音雇锡,去河邊找鬼逛钻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锰提,可吹牛的內(nèi)容都是我干的曙痘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼立肘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼边坤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起谅年,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茧痒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后融蹂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旺订,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年超燃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了区拳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡意乓,死狀恐怖樱调,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤笆凌,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布圣猎,位于F島的核電站,受9級(jí)特大地震影響菩颖,放射性物質(zhì)發(fā)生泄漏样漆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一晦闰、第九天 我趴在偏房一處隱蔽的房頂上張望放祟。 院中可真熱鬧,春花似錦呻右、人聲如沸跪妥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眉撵。三九已至,卻和暖如春落塑,著一層夾襖步出監(jiān)牢的瞬間纽疟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工憾赁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留污朽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓龙考,卻偏偏與公主長(zhǎng)得像蟆肆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晦款,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354