Heim > Web-Frontend > js-Tutorial > Node.js übt den Aufbau eines einfachen Webservers

Node.js übt den Aufbau eines einfachen Webservers

高洛峰
Freigeben: 2016-12-28 11:24:02
Original
1011 Leute haben es durchsucht

Wenn Sie mit der Webentwicklung auf .NET oder anderen ähnlichen Plattformen vertraut sind, fragen Sie sich vielleicht: Was bringt es, einen Webserver einzurichten? Erstellen Sie einfach ein Webprojekt in Visual Studio und klicken Sie, um es auszuführen. Dies ist tatsächlich der Fall, aber vergessen Sie bitte nicht, dass die Kosten darin bestehen, dass Sie beispielsweise, wenn Sie .NET zum Entwickeln einer Webanwendung verwenden, einen vollständigen IIS als Webserver-Grundlage verwenden, sodass Sie bei der Veröffentlichung Ihrer Anwendung , dann kann ich nur IIS verwenden. Wenn Sie einen eigenständigen Server verwenden (selbst erstellt mit System.Web.Hosting), müssen Sie sich mit verschiedenen HttpListeners und entsprechenden Threads befassen, was problematischer ist. Schließlich ist .NET nicht auf das Web ausgerichtet. Node.js bietet hierfür einen komfortablen und anpassbaren Ansatz, auf dem Sie eine ausgereifte Serviceplattform aufbauen können, die vollständig auf Ihre Anwendung ausgerichtet ist.


1. Der Aufbau eines einfachen Webservers erfordert einige grundlegende Wissenspunkte von Node.js:

1. Modul anfordern
In Node.js stellt das System viele nützliche Module bereit (Natürlich können Sie auch eigene Module in JavaScript schreiben, wir werden diese in zukünftigen Kapiteln ausführlich erläutern), wie z. B. http, URL usw. Module kapseln bestimmte Funktionen und stellen entsprechende Methoden oder Attribute bereit. Um diese Module verwenden zu können, müssen Sie das Modul zunächst auffordern, sein Operationsobjekt zu erhalten.

Wenn Sie beispielsweise das http-Modul des Systems verwenden möchten, können Sie schreiben:

var libHttp = require('http'); //请求HTTP协议模块
Nach dem Login kopieren

Auf diese Weise können zukünftige Programme auf die Funktionen des http-Moduls zugreifen die Variable libHttp. Die folgenden Systemmodule werden in den Routinen in diesem Kapitel verwendet:
http: kapselt die Server- und Client-Implementierung des http-Protokolls;
url: kapselt das Parsen und Verarbeiten von URLs;
fs: kapselt die Funktion von Dateisystemoperationen;
Pfad: Kapselt die Pfadanalysefunktion.
Mit diesen Modulen können wir auf den Schultern von Giganten stehen und unsere eigenen Anwendungen entwickeln.
2. Konsole
Um den Betrieb des Programms besser beobachten und Fehler beim Auftreten von Ausnahmen überprüfen zu können, können Sie die Funktion der Konsole über die Variable console nutzen.

console.log('这是一段日志信息'); 
计时并在控制台上输出计时信息: 
//开始计时 
console.timeEnd('计时器1'); //开始名称为“计时器1”的计时器 
... 
... 
... 
//结束计时,并输出到控制台 
console.timeEnd('计时器1'); //结束称为“计时器1”的计时器并输出
Nach dem Login kopieren

3. Funktionen definieren
Die Art und Weise, eine Funktion in Node.js zu definieren, ist genau die gleiche wie in gewöhnlichem JavaScript, aber unsere empfohlene Schreibmethode ist wie folgt, das heißt, eine Variable zu verwenden um die Funktion zu benennen, damit Sie sie vergleichen können. Es ist bequem und klar, Funktionen als Parameter an andere Funktionen zu übergeben:

//定义一个名为showErr的函数 
var showErr=function(msg){ 
var inf="错误!"+msg; 
console.log(inf+msg); 
return msg; 
}
Nach dem Login kopieren

4. Erstellen Sie einen Webserver und warten Sie auf Zugriffsanfragen
Das Wichtigste Beim Erstellen eines Webservers geht es darum, eine Antwortfunktion für Webanforderungen bereitzustellen. Er verfügt über zwei Parameter: Der erste stellt die vom Client angeforderten Informationen dar und der andere stellt die an den Client zurückzugebenden Informationen dar. In der Antwortfunktion sollten die Anforderungsinformationen analysiert und der zurückgegebene Inhalt entsprechend der Anforderung zusammengestellt werden.

//请求模块 
var libHttp = require('http'); //HTTP协议模块 
//Web服务器主函数,解析请求,返回Web内容 
var funWebSvr = function (req, res){ 
res.writeHead(200, {'Content-Type': 'text/html'}); 
res.write(&#39;<html><body>&#39;); 
res.write(&#39;<h1>*** Node.js ***</h1>&#39;); 
res.write(&#39;<h2>Hello!</h2>&#39;); 
res.end(&#39;</body></html>&#39;); 
} 
//创建一个http服务器 
var webSvr=libHttp.createServer(funWebSvr); 
//开始侦听8124端口 
webSvr.listen(8124);
Nach dem Login kopieren

5. Webanfragen analysieren
Für einfache Webseitenzugriffsanfragen sind wichtige Informationen in der URL der Anforderungsinformationsparameter enthalten. Wir können das URL-Parsing-Modul verwenden, um den Zugriffspfad zu analysieren die URL und verwenden Sie das Pfadmodul, um den Zugriffspfad in den tatsächlichen Dateipfad zusammenzusetzen, auf den für die Rückgabe zugegriffen werden soll.

var reqUrl=req.url; //获取请求的url 
//向控制台输出请求的路径 
console.log(reqUrl); 
//使用url解析模块获取url中的路径名 
var pathName = libUrl.parse(reqUrl).pathname; 
//使用path模块获取路径名中的扩展名 
if (libPath.extname(pathName)=="") { 
//如果路径没有扩展名 
pathName+="/"; //指定访问目录 
} 
if (pathName.charAt(pathName.length-1)=="/"){ 
//如果访问目录 
pathName+="index.html"; //指定为默认网页 
} 
//使用路径解析模块,组装实际文件路径 
var filePath = libPath.join("./WebRoot",pathName);
Nach dem Login kopieren

6. Legen Sie den Return-Header fest
Da es sich um eine Webanforderung handelt, muss der HTTP-Return-Header im Rückgabeinhalt enthalten sein die Dateierweiterung des Dateipfads, auf den zugegriffen werden soll.

var contentType=""; 
//使用路径解析模块获取文件扩展名 
var ext=libPath.extname(filePath); 
switch(ext){ 
case ".html": 
contentType= "text/html"; 
break; 
case ".js": 
contentType="text/javascript"; 
break; 
... 
... 
default: 
contentType="application/octet-stream"; 
} 
//在返回头中写入内容类型 
res.writeHead(200, {"Content-Type": contentType });
Nach dem Login kopieren

7. Schreiben Sie den Inhalt der Datei, auf die zugegriffen wird, in das zurückgegebene Objekt
Mit dem tatsächlichen Pfad der Datei, auf die zugegriffen werden muss, und dem der Datei entsprechenden Inhaltstyp können Sie die fs-Datei verwenden Systemmodul zum Lesen. Die Datei wird gestreamt und an den Client zurückgegeben.

//判断文件是否存在 
libPath.exists(filePath,function(exists){ 
if(exists){//文件存在 
//在返回头中写入内容类型 
res.writeHead(200, {"Content-Type": funGetContentType(filePath) }); 
//创建只读流用于返回 
var stream = libFs.createReadStream(filePath, {flags : "r", encoding : null}); 
//指定如果流读取错误,返回404错误 
stream.on("error", function() { 
res.writeHead(404); 
res.end("<h1>404 Read Error</h1>"); 
}); 
//连接文件流和http返回流的管道,用于返回实际Web内容 
stream.pipe(res); 
} 
else { //文件不存在 
//返回404错误 
res.writeHead(404, {"Content-Type": "text/html"}); 
res.end("<h1>404 Not Found</h1>"); 
} 
});
Nach dem Login kopieren

2. Testen und Betrieb
1. Vollständiger Quellcode
Die folgenden 100 Zeilen JavaScript sind der gesamte Quellcode zum Erstellen eines so einfachen Webservers:

//------------------------------------------------ 
//WebSvr.js 
// 一个演示Web服务器 
//------------------------------------------------ 
//开始服务启动计时器 
console.time('[WebSvr][Start]'); 
//请求模块 
var libHttp = require('http'); //HTTP协议模块 
var libUrl=require('url'); //URL解析模块 
var libFs = require("fs"); //文件系统模块 
var libPath = require("path"); //路径解析模块 
//依据路径获取返回内容类型字符串,用于http返回头 
var funGetContentType=function(filePath){ 
var contentType=""; 
//使用路径解析模块获取文件扩展名 
var ext=libPath.extname(filePath); 
switch(ext){ 
case ".html": 
contentType= "text/html"; 
break; 
case ".js": 
contentType="text/javascript"; 
break; 
case ".css": 
contentType="text/css"; 
break; 
case ".gif": 
contentType="image/gif"; 
break; 
case ".jpg": 
contentType="image/jpeg"; 
break; 
case ".png": 
contentType="image/png"; 
break; 
case ".ico": 
contentType="image/icon"; 
break; 
default: 
contentType="application/octet-stream"; 
} 
return contentType; //返回内容类型字符串 
} 
//Web服务器主函数,解析请求,返回Web内容 
var funWebSvr = function (req, res){ 
var reqUrl=req.url; //获取请求的url 
//向控制台输出请求的路径 
console.log(reqUrl); 
//使用url解析模块获取url中的路径名 
var pathName = libUrl.parse(reqUrl).pathname; 
if (libPath.extname(pathName)=="") { 
//如果路径没有扩展名 
pathName+="/"; //指定访问目录 
} 
if (pathName.charAt(pathName.length-1)=="/"){ 
//如果访问目录 
pathName+="index.html"; //指定为默认网页 
} 
//使用路径解析模块,组装实际文件路径 
var filePath = libPath.join("./WebRoot",pathName); 
//判断文件是否存在 
libPath.exists(filePath,function(exists){ 
if(exists){//文件存在 
//在返回头中写入内容类型 
res.writeHead(200, {"Content-Type": funGetContentType(filePath) }); 
//创建只读流用于返回 
var stream = libFs.createReadStream(filePath, {flags : "r", encoding : null}); 
//指定如果流读取错误,返回404错误 
stream.on("error", function() { 
res.writeHead(404); 
res.end("<h1>404 Read Error</h1>"); 
}); 
//连接文件流和http返回流的管道,用于返回实际Web内容 
stream.pipe(res); 
} 
else { //文件不存在 
//返回404错误 
res.writeHead(404, {"Content-Type": "text/html"}); 
res.end("<h1>404 Not Found</h1>"); 
} 
}); 
} 
//创建一个http服务器 
var webSvr=libHttp.createServer(funWebSvr); 
//指定服务器错误事件响应 
webSvr.on("error", function(error) { 
console.log(error); //在控制台中输出错误信息 
}); 
//开始侦听8124端口 
webSvr.listen(8124,function(){ 
//向控制台输出服务启动的信息 
console.log('[WebSvr][Start] running at http://127.0.0.1:8124/'); 
//结束服务启动计时器并输出 
console.timeEnd('[WebSvr][Start]'); 
});
Nach dem Login kopieren

2. Ressourcenverzeichnis

Da wir einen Webserver einrichten möchten, müssen wir ein WebRoot-Verzeichnis erstellen, um tatsächliche Webseiten und Bildressourcen zu speichern. Der Verzeichnisname „WebRoot“ wird oben verwendet Quellcode, um den tatsächlichen Dateipfad zusammenzustellen.

Node.js实战 建立简单的Web服务器

3. Ausführen und testen

Geben Sie in die Befehlszeile ein:

node.exe WebSvr.js

Unser Webserver läuft jetzt. Der Zugriff erfolgt wie folgt:

Node.js实战 建立简单的Web服务器

Postscript

Mit Node.js können wir problemlos einen relativ unabhängigen Webserver erstellen. Seine ereignisgesteuerten Funktionen vermeiden umständlichen Thread-Schutz und seine Basismodule verringern die Schwierigkeit der Entwicklung. Der in diesem Kapitel eingerichtete Webserver ist nur ein einfaches Beispiel, bei dem Modularität, Sicherheit und andere Probleme nicht allzu sehr berücksichtigt werden. Er kann Ihnen jedoch dabei helfen, einige Grundkenntnisse der Node.js-Entwicklung zu erlernen.

Weitere praktische Node.js-Artikel zum Einrichten eines einfachen Webservers finden Sie auf der chinesischen PHP-Website!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage