1.Installation
Tout d'abord, allez sur http://nodejs.org pour télécharger et installer. La version que j'ai téléchargée est la 0.8.14. L'installation est très simple, passez simplement à l'étape suivante. Configurez ensuite le répertoire d'installation dans le chemin, et msi installera npm (Node Package Manager) ensemble.
Mon répertoire d'installation est C:Program Files (x86)nodejs. À ce stade, utilisez la fenêtre de commande cmd node -v
et la commande npm -v
pour vérifier la version installée
1.1, bonjour le monde
Créez un nouveau fichier hello.js dans le répertoire du projet Node.js et tapez-y une ligne de code
console.log('hello, nodejs.') ;
Entrez dans la console de ligne de commande, entrez dans le répertoire du projet Node.js et tapez node hello.js
La sortie de la console "bonjour, nodejs."
1.2, version web de helloworld
Créez un nouveau http.js dans le répertoire du projet Node.js, le code est le suivant
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("Hello World!"); response.end(); }).listen(8000);
Démarrez le service dans la ligne de commande et tapez node http.js
Ouvrez ensuite la barre d'adresse du navigateur et entrez http://localhost:8000/ Lorsque vous voyez la sortie Hello World !
La version de node.js doit être synchronisée avec l'API
Les numéros de version de node.js sont réguliers. Les versions paires sont des versions stables et les versions impaires sont des versions instables
2 Analyse du code HelloWorld
D’accord, analysons désormais notre HelloWorld ligne par ligne.
Module d'introduction
var http = require("http");
La méthode require est utilisée pour introduire un module, et le paramètre est le nom du module. Par exemple, le module File System peut être introduit comme ceci :
var fs = require("fs");
Nous pouvons utiliser la méthode require() comme méthode globale, mais en fait elle ressemble plus à une méthode locale appartenant à un certain module. Sa documentation est ici : https://nodejs.org/api/globals.html. .
La méthode require renvoie une instance d'un certain module. Par exemple, require("http") renvoie une instance HTTP. La documentation de référence pour les exemples HTTP est ici : https://nodejs.org/api/http.html.
On voit que le module HTTP possède une méthode createServer(), qui implique notre deuxième ligne de code.
Créer un serveur
La méthode createServer() du module HTTP accepte une méthode en paramètre, et le prototype est :
http.createServer([requestListener])
requestListener est une méthode associée à l'événement request de la classe http.Server. De cette façon, lorsque la demande du client arrive, le requestListener sera appelé.
requestListener a deux paramètres, et le prototype de la fonction est le suivant :
function (request, response) { }
Le type de la première requête de paramètre est http.IncomingMessage
, qui implémente l'interface Readable Stream
.
Le type du deuxième paramètre est http.ServerResponse
, qui implémente l'interface Writeable Stream
.
L'API de Stream est ici : https://nodejs.org/api/stream.html. Dans le même temps, la demande et la réponse sont également des EventEmitters, qui peuvent émettre des événements spécifiques.
L'API d'EventEmitter est ici : https://nodejs.org/api/events.html#events_class_events_evenemitter Plus tard, nous parlerons de la façon d'utiliser EventEmitter pour émettre et traiter des événements.
Revoyons le code que nous avons créé pour le serveur :
http.createServer( function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World!"); response.end(); } ).listen(8000);
http.createServer renvoie une instance http.Server La méthode d'écoute de http.Server permet au serveur d'écouter sur un certain port, qui est 8000 dans l'exemple.
Comme vous pouvez le voir, nous fournissons une fonction anonyme à la méthode createServer. Dans cette méthode, nous renvoyons le message « Hello World ! » au client via le paramètre de réponse.
Analyser les demandes des clients
Nous avons analysé la méthode http.createServer plus tôt. Son paramètre est une méthode avec deux paramètres, l'un représentant la requête envoyée par le client et l'autre représentant la réponse à renvoyer au client. Jetons un coup d'œil aux paramètres de la requête.
request est une instance de http.IncomingMessage
Grâce à cette instance, nous pouvons obtenir les paramètres de la requête, tels que la méthode HTTP, la version HTTP, l'url, l'en-tête, etc. L'API spécifique est ici : https://nodejs.org. /api /http.html#http_http_incomingmessage.
Jetons un coup d'œil en modifiant HelloWorld.js (enregistrez sous HelloWorld2.js). Le code est le suivant :
// 引入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的异步特性,获得不错的性能。