.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('<html><body>'); res.write('<h1>*** Node.js ***</h1>'); res.write('<h2>Hello!</h2>'); res.end('</body></html>'); } //创建一个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"라는 디렉터리 이름을 사용했습니다. 실제 파일 경로를 조합하는 소스 코드입니다.
3. 실행 및 테스트
명령줄에
node.exe WebSvr.js
현재 당사 웹서버는 브라우저를 통해 접속이 가능합니다.
Postscript Node.js를 사용하면 상대적으로 독립적인 웹 서버를 쉽게 구축할 수 있습니다. 이벤트 기반 기능은 번거로운 스레드 보호를 방지하고 기본 모듈은 개발의 어려움을 줄여줍니다. 이 장에서 구축한 웹 서버는 모듈성, 보안 및 기타 문제를 너무 많이 고려하지 않은 단순한 샘플이지만 Node.js 개발에 대한 기본 지식을 익히는 데 도움이 될 수 있습니다. 간단한 웹 서버 구축에 대한 더 많은 Node.js 실용적인 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!