>웹 프론트엔드 >JS 튜토리얼 >Node.js로 간단한 웹 서버 구축 연습

Node.js로 간단한 웹 서버 구축 연습

高洛峰
高洛峰원래의
2016-12-28 11:24:02996검색

.NET 또는 기타 유사한 플랫폼에서의 웹 개발에 익숙하다면 웹 서버를 설정하는 것이 무슨 의미가 있을까요? Visual Studio에서 웹 프로젝트를 만들고 클릭하여 실행하면 됩니다. 실제로 그렇습니다. 그러나 예를 들어 웹 응용 프로그램을 개발하기 위해 .NET을 사용하는 경우에는 완전한 IIS를 웹 서버의 기반으로 사용하므로 응용 프로그램을 개발할 때 비용이 발생한다는 점을 잊지 마십시오. 릴리스되면 IIS만 사용할 수 있습니다. 그리고 독립형 서버(System.Web.Hosting을 사용하여 직접 구축)를 사용하는 경우 다양한 HttpListener 및 해당 스레드를 처리해야 하는데 이는 결국 .NET이 웹에 중점을 두지 않기 때문입니다. Node.js는 이와 관련하여 편리하고 사용자 정의 가능한 접근 방식을 제공하며 이를 통해 애플리케이션에 완벽하게 맞는 정교한 서비스 플랫폼을 구축할 수 있습니다.


1. 간단한 웹 서버를 구축하려면 Node.js의 몇 가지 기본 지식이 필요합니다.

1. 요청 모듈
Node.js에서 시스템은 많은 유용한 모듈을 제공합니다. (물론 JavaScript로 자신만의 모듈을 작성할 수도 있습니다. 이에 대해서는 이후 장에서 자세히 설명하겠습니다)(예: http, url 등) 모듈은 특정 기능을 캡슐화하고 해당 메서드나 속성을 제공합니다. 이러한 모듈을 사용하려면 먼저 모듈에 작업 개체를 요청해야 합니다.

예를 들어 시스템의 http 모듈을 사용하려는 경우 다음과 같이 작성할 수 있습니다.

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

이러한 방식으로 향후 프로그램은 다음을 통해 http 모듈의 기능에 액세스할 수 있습니다. 변수 libHttp. 이 장의 루틴에서는 다음 시스템 모듈이 사용됩니다.
http: http 프로토콜의 서버 및 클라이언트 구현을 캡슐화합니다.
url: URL의 구문 분석 및 처리를 캡슐화합니다.
fs: 함수를 캡슐화합니다. 파일 시스템 작업 ;
path: 경로 구문 분석 기능을 캡슐화합니다.
이러한 모듈을 통해 우리는 거대 기업의 어깨 위에 서서 자체 애플리케이션을 구축할 수 있습니다.
2. 콘솔
프로그램의 동작을 더 잘 관찰하고 예외 발생 시 오류를 확인하려면 변수 콘솔을 통해 콘솔의 기능을 사용할 수 있습니다.

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

3. 함수 정의
Node.js에서 함수를 정의하는 방법은 일반 JavaScript와 완전히 동일하지만 권장하는 작성 방법은 다음과 같습니다. 즉, 변수를 사용합니다. 비교할 수 있도록 함수 이름을 지정합니다. 함수를 다른 함수에 매개 변수로 전달하는 것이 편리하고 명확합니다.

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

4. 웹 서버를 만들고 액세스 요청을 수신합니다.
가장 중요한 웹 서버를 만드는 데 있어 중요한 점은 웹 요청에 대한 응답 기능을 제공하는 것입니다. 여기에는 두 개의 매개변수가 있습니다. 첫 번째는 클라이언트가 요청한 정보를 나타내고 다른 하나는 클라이언트에 반환할 정보를 나타냅니다. 응답 기능에서는 요청 정보를 구문 분석하고 반환된 콘텐츠를 요청에 따라 조합해야 합니다.

//请求模块 
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);

5. 웹 요청 분석
간단한 웹 페이지 액세스 요청의 경우 요청 정보 매개변수의 URL에 중요한 정보가 포함되어 있습니다. 그리고 경로 모듈을 사용하여 반환을 위해 액세스할 실제 파일 경로로 액세스 경로를 조합합니다.

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);

6. 반환 헤더 설정
웹 요청이므로 반환 내용에 http 반환 헤더가 포함되어야 합니다. 액세스할 파일 경로의 파일 확장자 콘텐츠 유형입니다.

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 });

7. 액세스한 파일 내용을 반환된 객체에 씁니다.
액세스해야 하는 파일의 실제 경로와 파일에 해당하는 콘텐츠 유형을 사용하여 fs 파일을 사용할 수 있습니다. 파일을 읽기 위한 시스템 모듈입니다. 파일이 스트리밍되어 클라이언트에 반환됩니다.

//判断文件是否存在 
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>"); 
} 
});

2. 테스트 및 운영
1. 전체 소스코드
다음 100줄의 자바스크립트는 모두 이런 간단한 웹서버를 구축하기 위한 소스코드입니다.

//------------------------------------------------ 
//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]'); 
});

2. 리소스 디렉터리

웹 서버를 구축하고자 하므로 실제 웹 페이지와 이미지 리소스를 저장할 WebRoot 디렉터리를 생성해야 합니다. 위에서는 "WebRoot"라는 디렉터리 이름을 사용했습니다. 실제 파일 경로를 조합하는 소스 코드입니다.

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

3. 실행 및 테스트

명령줄에

node.exe WebSvr.js

를 입력합니다.

현재 당사 웹서버는 브라우저를 통해 접속이 가능합니다.

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

Postscript

Node.js를 사용하면 상대적으로 독립적인 웹 서버를 쉽게 구축할 수 있습니다. 이벤트 기반 기능은 번거로운 스레드 보호를 방지하고 기본 모듈은 개발의 어려움을 줄여줍니다. 이 장에서 구축한 웹 서버는 모듈성, 보안 및 기타 문제를 너무 많이 고려하지 않은 단순한 샘플이지만 Node.js 개발에 대한 기본 지식을 익히는 데 도움이 될 수 있습니다.

간단한 웹 서버 구축에 대한 더 많은 Node.js 실용적인 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.