首頁 > web前端 > js教程 > Nodejs學習item【入門手上】_node.js

Nodejs學習item【入門手上】_node.js

WBOY
發布: 2016-05-16 15:01:57
原創
1738 人瀏覽過

一、 安裝

首先,到http://nodejs.org 下載安裝。我下的版本是0.8.14。安裝很簡單,下一步下一步就很哦了。然後在path中設定安裝目錄即可,msi會把npm(Node Package Manager)一併裝上。

Nodejs學習item【入門手上】_node.js

我的安裝目錄是C:Program Files (x86)nodejs。這時使用cmd指令視窗 node -vnpm -v指令查看下安裝的版本

1.1、helloworld

在Node.js工程目錄中新建一個檔案hello.js,裡面敲一行程式碼

console.log('hello, nodejs.') ;
登入後複製

進入命令列控制台,進入到Node.js工程目錄敲node hello.js

控制台輸出了「hello, nodejs.」

1.2、web版的helloworld

在Node.js工程目錄中新建一個http.js,程式碼如下

var http = require("http");
http.createServer(function(request, response) {
 response.writeHead(200, {"Content-Type": "text/html"});
 response.write("Hello World!");
 response.end();
}).listen(8000);
登入後複製

在命令列啟動服務,敲 node http.js

然後開啟瀏覽器網址列輸入http://localhost:8000/,看見頁面上輸出Hello World! 就成功了。

node.js的版本一定跟API同步

node.js的版本號碼有規律,偶數版本為穩定版本,奇數版本非穩定版本

2 HelloWorld程式碼分析

好啦,從現在開始逐行分析我們的HelloWorld。

引入模組

var http = require("http");
登入後複製

require方法用來引入一個模組,參數是模組的名字。例如File System模組,可以這麼引入:

var fs = require("fs");
登入後複製

我們可以把require()方法當作全域方法使用,但其實它比較像是屬於某個模組的本地方法,它的文件參考這裡:https://nodejs.org/api/globals.html。

require方法傳回某個模組的實例,例如require(“http”)就回傳一個HTTP實例。 HTTP實例的參考文件在這裡:https://nodejs.org/api/http.html。

我們看到,HTTP模組有一個方法createServer(),就牽涉到我們的第二行程式碼了。

建立伺服器

HTTP模組的createServer()方法,接受一個方法作為參數,原型為:

http.createServer([requestListener])
登入後複製

requestListener是一種方法,會與http.Server類別的request事件關聯起來。這樣當客戶端請求到達時,requestListener就會被呼叫。

requestListener有兩個參數,函數原型如下:

function (request, response) { }
登入後複製

第一個參數request的型別是http.IncomingMessage,實作了Readable Stream介面。
第二個參數的型別是http.ServerResponse,實作了Writeable Stream介面。

Stream的API在這裡:https://nodejs.org/api/stream.html。同時,request和response還是EventEmitter,可以發射特定的事件。

EventEmitter的API在這裡:https://nodejs.org/api/events.html#events_class_events_eventemitter,後面我們會講如何使用EventEmitter來發射事件、處理事件。

再回顧一下我們建立server的程式碼:

http.createServer(
 function(request, response) { 
  response.writeHead(200, {"Content-Type": "text/plain"}); 
  response.write("Hello World!"); 
  response.end(); 
 }
).listen(8000); 
登入後複製

http.createServer傳回一個http.Server實例,http.Server的listen方法可以讓伺服器監聽在某個連接埠上,範例中是8000。

如你所見,我們提供了一個匿名函數給createServer方法。在這個方法中,我們透過response參數向客戶端回寫了「Hello World!」訊息。

分析客戶端請求

前面我們分析了http.createServer方法,它的參數是一個帶兩個參數的方法,一個代表了客戶端發過來的請求,一個代表了要回寫給客戶端的回應。我們來看看request參數。

request是http.IncomingMessage的實例,透過這個實例,我們可以拿到請求參數,例如HTTP方法、HTTP版本、url、頭部等,具體的API在這裡:https://nodejs.org/api /http.html#http_http_incomingmessage。

我們透過修改HelloWorld.js來看看(另存為HelloWorld2.js)。程式碼如下:

// 引入http模块
var http = require("http"); 

// 创建server,指定处理客户端请求的函数
http.createServer(
 function(request, response) { 
  console.log("method - " + request.method);
  console.log("version - " + request.httpVersion);
  console.log("url - " + request.url);
  response.writeHead(200, {"Content-Type": "text/plain"}); 
  response.write("Hello World!"); 
  response.end(); 
 }
).listen(8000); 

console.log("Hello World start listen on port 8000");
登入後複製

如你所见,我使用console这个对象来输出了一些调试信息,打印了HTTP方法、版本、url等信息。可以执行node HelloWorld2.js,浏览器访问http://localhost:8000,然后跑到命令行看看输出了什么信息,我这里是这样的:

Nodejs學習item【入門手上】_node.js

我们简简单单的HelloWorld已经可以发送一些响应数据给客户端,你在浏览器里能看到“Hello World!”字样。这个响应是通过http.ServerResponse的实例response发送给客户端的。

http.ServerResponse也是一个Stream,还是一个EventEmitter。我们通过它给客户度返回HTTP状态码、数据、HTTP头部等信息。

HTTP模块
在Node.js的HTTP模块,状态行就是通过http.ServerResponse的writeHead方法写给客户端的。writeHead方法原型如下:

response.writeHead(statusCode[, statusMessage][, headers])
登入後複製

这个方法的第一个参数,就是statusCode,也就是200、403之类的数字,剩下的参数是可选的。最后一个参数是headers,你可以在这里使用JSON对象表示法来写一些HTTP头部,比如:{“Content-Type”:”text/plain”,”Content-Length”:11}。第一个可选参数statusMessage用来指定一个状态描述消息,可以不填写。

HTTP头部

头部就是一些key-value对,比如我们在HelloWorld里看到的”Content-Type”,就是用来说明数据类型的头部标签,对应的可能是文本文件、图片、视频、二进制等。类似的还有”Content-Length”,用来指定数据长度。还有很多很多,比如”Date”、”Connection”等。具体还是参考前面的链接吧。

头部还可以使用http.ServerResponse的response.setHeader(name, value)方法来单独设置,一次可以设置一个HTTP头部。

数据

头部之后就是数据了,有些状态码,比如200,后续都会有一些数据。而有些,比如301、404、403、500之类的,多数没有数据。

数据通过http.ServerResponse的write方法来写回给客户端,比如这样:

response.setHeader("Content-Type", "text/html");
登入後複製

这里要提一点,HTTP常见的数据传输编码方式有两种:

设置Content-Length,传输固定长度的数据设置Transfer-Encoding头部为chunked,分块传输数据

像我们现在的HelloWorld示例,没有设置Content-Length头部,Node.js的HTTP模块就默认为chunked编码。

我们使用Chrome浏览器的开发者工具来查看网络数据,可以很明确的看到。如下图所示:

Nodejs學習item【入門手上】_node.js

HTTP响应

我标注出来的三处,都是HelloWorld示例传递给浏览器的HTTP头部信息。

我们通过http.ServerResponse的write方法向客户端写数据。你可以一次写入所有数据,也可以把数据分开来多次写入。当要传输的数据量较大时,分多次写入就是比较合理的做法,比如你向客户端发送大文件,就比较适合分多次写入,也可以利用Node.js的异步特性,获得不错的性能。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板