Heim > Artikel > Web-Frontend > Nodejs-Lernelement【Erste Schritte】_node.js
1. Installation
Gehen Sie zunächst zu http://nodejs.org, um es herunterzuladen und zu installieren. Die von mir heruntergeladene Version ist 0.8.14. Die Installation ist sehr einfach, machen Sie einfach den nächsten Schritt. Konfigurieren Sie dann das Installationsverzeichnis im Pfad und msi installiert npm (Node Package Manager) zusammen.
Mein Installationsverzeichnis ist C:Programme (x86)nodejs. Verwenden Sie zu diesem Zeitpunkt das cmd-Befehlsfenster node -v
und den Befehl npm -v
, um die installierte Version
1.1, hallowelt
Erstellen Sie eine neue Datei hello.js im Node.js-Projektverzeichnis und geben Sie eine Codezeile darin ein
console.log('hello, nodejs.') ;
Betreten Sie die Befehlszeilenkonsole, geben Sie das Node.js-Projektverzeichnis ein und geben Sie node hello.js ein
Die Konsolenausgabe „hello, nodejs.“
1.2, Webversion von helloworld
Erstellen Sie eine neue http.js im Node.js-Projektverzeichnis. Der Code lautet wie folgt
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("Hello World!"); response.end(); }).listen(8000);
Starten Sie den Dienst in der Befehlszeile und geben Sie node http.js ein
Öffnen Sie dann die Adressleiste des Browsers und geben Sie http://localhost:8000/ ein. Wenn Sie die Ausgabe „Hello World!“ sehen, ist der Vorgang erfolgreich.
Die Version von node.js muss mit der API synchronisiert werden
Die Versionsnummern von node.js sind reguläre Versionen und ungeradzahlige Versionen sind instabile Versionen.
2 HelloWorld-Codeanalyse
Okay, analysieren wir von nun an unsere HelloWorld Zeile für Zeile.
Einführungsmodul
var http = require("http");
Die Require-Methode wird zum Einführen eines Moduls verwendet, und der Parameter ist der Name des Moduls. Das Dateisystemmodul kann beispielsweise wie folgt eingeführt werden:
var fs = require("fs");
Wir können die Methode require() als globale Methode verwenden, sie ähnelt jedoch eher einer lokalen Methode, die zu einem bestimmten Modul gehört. Die Dokumentation finden Sie hier: https://nodejs.org/api/globals.html .
Die require-Methode gibt eine Instanz eines bestimmten Moduls zurück. require("http") gibt beispielsweise eine HTTP-Instanz zurück. Die Referenzdokumentation für HTTP-Beispiele finden Sie hier: https://nodejs.org/api/http.html.
Wir sehen, dass das HTTP-Modul eine Methode createServer() hat, die unsere zweite Codezeile einbezieht.
Server erstellen
Die Methode createServer() des HTTP-Moduls akzeptiert eine Methode als Parameter und der Prototyp ist:
http.createServer([requestListener])
requestListener ist eine Methode, die dem Anforderungsereignis der http.Server-Klasse zugeordnet ist. Auf diese Weise wird der requestListener aufgerufen, wenn die Clientanforderung eintrifft.
requestListener hat zwei Parameter und der Funktionsprototyp lautet wie folgt:
function (request, response) { }
Der Typ der ersten Parameteranforderung ist http.IncomingMessage
, der die Readable Stream
-Schnittstelle implementiert.
Der Typ des zweiten Parameters ist http.ServerResponse
, der die Schnittstelle Writeable Stream
implementiert.
Die API von Stream finden Sie hier: https://nodejs.org/api/stream.html. Gleichzeitig sind Anfrage und Antwort auch EventEmitter, die bestimmte Ereignisse aussenden können.
Die API von EventEmitter ist hier: https://nodejs.org/api/events.html#events_class_events_eventemitter Später werden wir darüber sprechen, wie man EventEmitter zum Ausgeben und Verarbeiten von Ereignissen verwendet.
Sehen wir uns den Code an, den wir auf dem Server erstellt haben:
http.createServer( function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World!"); response.end(); } ).listen(8000);
http.createServer gibt eine http.Server-Instanz zurück. Die Listen-Methode von http.Server ermöglicht es dem Server, einen bestimmten Port abzuhören, im Beispiel 8000.
Wie Sie sehen können, stellen wir der Methode createServer eine anonyme Funktion zur Verfügung. Bei dieser Methode schreiben wir die „Hello World!“-Nachricht über den Antwortparameter an den Client zurück.
Kundenanfragen analysieren
Wir haben die Methode http.createServer zuvor analysiert. Ihr Parameter ist eine Methode mit zwei Parametern, von denen einer die vom Client gesendete Anfrage und der andere die an den Client zurückzuschreibende Antwort darstellt. Werfen wir einen Blick auf die Anforderungsparameter.
request ist eine Instanz von http.IncomingMessage
. Über diese Instanz können wir die Anforderungsparameter wie HTTP-Methode, HTTP-Version, URL, Header usw. abrufen. Die spezifische API finden Sie hier: https://nodejs.org /api /http.html#http_http_incomingmessage.
Lassen Sie uns einen Blick darauf werfen, indem wir HelloWorld.js ändern (speichern als HelloWorld2.js). Der Code lautet wie folgt:
// 引入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的异步特性,获得不错的性能。