1. 설치
먼저 http://nodejs.org로 이동하여 다운로드하고 설치하세요. 제가 다운로드한 버전은 0.8.14 입니다. 설치는 매우 간단합니다. 다음 단계만 진행하면 됩니다. 그런 다음 해당 경로에 설치 디렉터리를 구성하면 msi가 npm(Node Package Manager)을 함께 설치합니다.
내 설치 디렉터리는 C:Program Files (x86)nodejs입니다. 이때 cmd 명령창node -v
과 npm -v
명령을 이용하여 설치된 버전을 확인
1.1, 헬로월드
Node.js 프로젝트 디렉터리에 hello.js라는 새 파일을 만들고 그 안에 코드 한 줄을 입력하세요
console.log('hello, nodejs.') ;
명령줄 콘솔에 들어가서 Node.js 프로젝트 디렉토리를 입력하고 node hello.js를 입력하세요
콘솔 출력 "hello, nodejs."
1.2, helloworld 웹 버전
Node.js 프로젝트 디렉토리에 새로운 http.js를 생성합니다. 코드는 다음과 같습니다
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("Hello World!"); response.end(); }).listen(8000);
명령줄에서 서비스를 시작하고 node http.js를 입력하세요
그런 다음 브라우저 주소 표시줄을 열고 http://localhost:8000/을 입력하세요. 페이지에 Hello World!가 출력되면 성공한 것입니다.
node.js 버전은 API와 동기화되어야 합니다
node.js의 버전 번호는 일반 버전이고, 홀수 버전은 불안정 버전입니다.
2 HelloWorld 코드 분석
자, 이제부터 HelloWorld를 한 줄씩 분석해 보겠습니다.
소개 모듈
var http = require("http");
require 메소드는 모듈을 소개하는 데 사용되며 매개변수는 모듈의 이름입니다. 예를 들어 파일 시스템 모듈은 다음과 같이 도입할 수 있습니다.
var fs = require("fs");
require() 메소드를 전역 메소드로 사용할 수 있지만 실제로는 특정 모듈에 속하는 로컬 메소드에 더 가깝습니다. 해당 문서는 https://nodejs.org/api/globals.html에 있습니다. .
require 메소드는 특정 모듈의 인스턴스를 반환합니다. 예를 들어 require("http")는 HTTP 인스턴스를 반환합니다. HTTP 예제에 대한 참조 문서는 https://nodejs.org/api/http.html에 있습니다.
HTTP 모듈에는 두 번째 코드 줄과 관련된 createServer() 메서드가 있는 것을 볼 수 있습니다.
서버 생성
HTTP 모듈의 createServer() 메소드는 메소드를 매개변수로 받아들이고 프로토타입은 다음과 같습니다.
http.createServer([requestListener])
requestListener는 http.Server 클래스의 요청 이벤트와 연관된 메소드입니다. 이런 방식으로 클라이언트 요청이 도착하면 requestListener가 호출됩니다.
requestListener에는 두 개의 매개변수가 있으며 함수 프로토타입은 다음과 같습니다.
function (request, response) { }
첫 번째 매개변수 요청 유형은 http.IncomingMessage
인터페이스를 구현하는 Readable Stream
입니다.
두 번째 매개변수의 유형은 http.ServerResponse
인터페이스를 구현하는 Writeable Stream
입니다.
Stream의 API는 https://nodejs.org/api/stream.html에 있습니다. 동시에 요청과 응답도 특정 이벤트를 내보낼 수 있는 EventEmitters입니다.
EventEmitter의 API는 https://nodejs.org/api/events.html#events_class_events_eventemitter에 있습니다. 나중에 EventEmitter를 사용하여 이벤트를 내보내고 처리하는 방법에 대해 설명하겠습니다.
서버를 생성한 코드를 검토해 보겠습니다.
http.createServer( function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World!"); response.end(); } ).listen(8000);
http.createServer는 http.Server 인스턴스를 반환합니다. http.Server의 수신 메소드를 사용하면 서버가 특정 포트(예: 8000)에서 수신 대기할 수 있습니다.
보시다시피 createServer 메소드에 익명 함수를 제공합니다. 이 방법에서는 응답 매개변수를 통해 "Hello World!" 메시지를 클라이언트에 다시 작성합니다.
고객 요청 분석
앞서 http.createServer 메소드를 분석했습니다. 해당 매개변수는 두 개의 매개변수를 갖는 메소드입니다. 하나는 클라이언트가 보낸 요청을 나타내고 다른 하나는 클라이언트에 다시 쓸 응답을 나타냅니다. 요청 매개변수를 살펴보겠습니다.
요청은 http.IncomingMessage
의 인스턴스입니다. 이 인스턴스를 통해 HTTP 메소드, HTTP 버전, URL, 헤더 등과 같은 요청 매개변수를 얻을 수 있습니다. 특정 API는 https://nodejs.org에 있습니다. /api /http.html#http_http_incoming메시지.
HelloWorld.js를 수정하여 살펴보겠습니다(HelloWorld2.js로 저장). 코드는 다음과 같습니다.
// 引入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的异步特性,获得不错的性能。