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/
接下來(lái),打開(kāi)瀏覽器訪問(wèn) http://127.0.0.1:8888/淹父,你會(huì)看到一個(gè)寫(xiě)著 "Hello 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
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提供了很多命令,例如
install
和publish
假勿,使用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á)式敏释。
下劃線()變量
你可以使用下劃線()獲取上一個(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)灌具。