1. インストール
まず、http://nodejs.org にアクセスしてダウンロードしてインストールします。私がダウンロードしたバージョンは0.8.14です。インストールは非常に簡単です。次のステップに進むだけです。次に、パスにインストール ディレクトリを設定すると、msi が npm (Node Package Manager) を一緒にインストールします。
私のインストールディレクトリは C:Program Files (x86)nodejs です。このとき、cmd コマンドウィンドウ node -v
と npm -v
コマンドを使用して、インストールされているバージョン
1.1、helloworld
Node.js プロジェクト ディレクトリに新しいファイル hello.js を作成し、そこにコード行を入力します
console.log('hello, nodejs.') ;
コマンドラインコンソールに入り、Node.js プロジェクトディレクトリに入り、「node hello.js」と入力します
コンソール出力「hello, nodejs.」
1.2、helloworld の Web バージョン
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 を 1 行ずつ分析してみましょう。
導入モジュール
var http = require("http");
require メソッドはモジュールを導入するために使用され、パラメータはモジュールの名前です。たとえば、ファイル システム モジュールは次のように導入できます:
var fs = require("fs");
require() メソッドはグローバル メソッドとして使用できますが、実際には特定のモジュールに属するローカル メソッドに似ています。そのドキュメントは https://nodejs.org/api/globals.html にあります。 。
require メソッドは特定のモジュールのインスタンスを返します。たとえば、require("http") は HTTP インスタンスを返します。 HTTP の例のリファレンス ドキュメントは、https://nodejs.org/api/http.html にあります。
HTTP モジュールには createServer() メソッドがあり、これにはコードの 2 行目が含まれていることがわかります。
サーバーの作成
HTTP モジュールの createServer() メソッドはメソッドをパラメータとして受け取ります。プロトタイプは次のとおりです。
http.createServer([requestListener])
requestListenerは、http.Serverクラスのリクエストイベントに関連付けられたメソッドです。このようにして、クライアントリクエストが到着すると、requestListener が呼び出されます。
requestListener には 2 つのパラメータがあり、関数のプロトタイプは次のとおりです:
function (request, response) { }
最初のパラメータリクエストのタイプは http.IncomingMessage
で、Readable Stream
インターフェイスを実装します。
2 番目のパラメーターの型は http.ServerResponse
で、Writeable Stream
インターフェイスを実装します。
Stream の API は、https://nodejs.org/api/stream.html にあります。同時に、リクエストとレスポンスは EventEmitter でもあり、特定のイベントを発行できます。
EventEmitter の API はここにあります: https://nodejs.org/api/events.html#events_class_events_eventemitter。後で、EventEmitter を使用してイベントを発行および処理する方法について説明します。
サーバーを作成したコードを確認してみましょう:
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 メソッドに匿名関数を提供しています。このメソッドでは、応答パラメーターを通じて「Hello World!」メッセージをクライアントに書き戻します。
クライアントのリクエストを分析する
先ほど http.createServer メソッドを分析しましたが、そのパラメータは 2 つのパラメータを持つメソッドで、1 つはクライアントから送信されるリクエストを表し、もう 1 つはクライアントに書き戻されるレスポンスを表します。リクエストパラメータを見てみましょう。
リクエストは 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,然后跑到命令行看看输出了什么信息,我这里是这样的:
我们简简单单的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浏览器的开发者工具来查看网络数据,可以很明确的看到。如下图所示:
HTTP响应
我标注出来的三处,都是HelloWorld示例传递给浏览器的HTTP头部信息。
我们通过http.ServerResponse的write方法向客户端写数据。你可以一次写入所有数据,也可以把数据分开来多次写入。当要传输的数据量较大时,分多次写入就是比较合理的做法,比如你向客户端发送大文件,就比较适合分多次写入,也可以利用Node.js的异步特性,获得不错的性能。