wiki:TranslateNodeJs

NodeJS

번역 소스

 http://nodejs.org/api.html

 http://nodejs.jp/nodejs.org_ja/api.html

Synopsis

var http = require('http');

http.createServer(function (request.response){
    response.writeHead(200, {'Content-Type':'text/plain'});
    response.end('Hello World\n');
}).listen(8124);

console.log("Server running at http://127.0.0.1:8124/");

이 서버를 돌리기 위해선 example.js 란 파일로 코드를 출력하고, node 명령어를 통해 실행해야 한다.

> node example.js
Server running at http://127.0.0.1:8124/

Standard Modules

Node에는 프로세스가 컴파일되어있는 모듈들이 포함되어있고, 그 대부분은 여기에 문서화 되어있다. 이 모듈들을 사용하는 가장 일반적인 방법은 require( 'name')의 반환 값을 모듈과 같은 이름(name)의 지역 변수에 할당하는 것이다.

예제:

var sys = require('sys');

다른 모듈에서 node를 확장할수 있다. Modules를 참조하라.

Buffers

리오.

EventEmitter

Node의 많은 객체들은 이벤트를 발생시킨다 : TCP 서버는 스트림이 생길때마다 이벤트를 발생, 자식 프로세스는 종료될때 이벤트를 발생. 이벤트를 발생하는 모든 객체는 events.EventEmitter의 인스턴스이다.

이벤트는 카멜표기법(CamelCase)의 문자열로 표현된다. 몇몇 예제: 'stream', 'data', 'messageBegin' 함수는 이벤트가 발생했을 때 실행되도록, 객체에 첨부될 수 있다. 이런 함수를 리스너(listeners)라 한다.

require('events').EventEmitter 에서 eventEmitter 클래스를 액세스 한다.

모든 EventEmitters는 새로운 리스너(listenders)가 추가될때 'newListener' 이벤트를 발생한다.

EventEmitter에 오류가 발생했을때, 전형적인 액션은 'error' 이벤트 발생이다. 오류 이벤트는 특별하다.- 핸들러가 없다면 스택 트레이스가 출력되고 프로그램은 종료된다.

Event:'newListener' function(event, listener){}

이 이벤트는 누군가(Object)가 새로운 리스너를 추가할때 발생된다.

Event:'error' function(exception){}

에러가 발생하면 이 이벤트는 발생한다. 이 이벤트는 특별하다. - 에러를 수신할 리스너가 없을때, Node는 실행을 종료하고 예외(exception)의 스택 트레이스를 보여준다.

emitter.on(event, listener)

리스너 배열의 끝에 지정된 이벤트에 대한 리스너를 추가한다. (객체에 메소드를 추가한다는 말.)

server.on('stream', function(stream){
   console.log('someone connected!');
});

emitter.removeListener(event, litener)

리스너 배열에서 지정된 이벤트에 대한 리스너를 제거한다. 주의 : 제거한 리스너 뒤쪽의 리스너 배열의 배열 색인이 변한다.

var callback = function(stream){
   console.log('someone connected!');
};
server.on('stream', callback);
//....
server.removeListener('stream', callback);

emitter.removeAllListener(event)

리스너 배열에서 지정된 이벤트에 대해 모든 리스너를 제거한다.

emitter.listeners(event)

지정된 이벤트에 대한 리스너배열을 반환합니다. 이 배열은 변경될수 있다. 예를 들어, 리스너들을 제거하는 등.

server.on('stream', function(stream){
  console.log('someone connected!");
});

console.log(sys.inspect(server.listeners('stream')));
//[[Function]]

emitter.emit(event, [arg1], [arg2], [... ...])

인수로 전달된 순서대로 리스너들을 실행한다.

Streams

리오

Readable Stream

리오

Writable Stream

리오

Global Objects

리오

process

리오

sys

리오

Timers

setTimeout(callback, delay, [arg], [... ...])

delay 밀리초 만큼 경과후 callback이 실행되도록 예약한다. clearTimeout()에서 사용할수 있도록 timeoutId를 반환한다. 선택사항으로, 콜백에대한 인자(arg)를 전달할 수 있다.

clearTimeout(timeoutId)

트리거로부터 실행지연을 방지한다. (setTimeOut() 으로 지정한 Callback의 실행지연을 해지한다.)

setInterval(callback, delay, [arg], [... ...])

delay 밀리초 간격으로 callback 실행을 반복하도록 예약한다. clearInterval()에서 사용할 수 있도록 intervalId를 반환한다. 선택사항으로, 콜백에대한 인자(arg)를 전달할 수 있다.

clearInterval(intervalId)

트리거로부터 반복실행을 중지한다.

Child Processes

Node는 ChildProcess클래스를 통해 3방향 popen(3) 기능을 제공한다.

비차단 방법 안에서 자식 프로세스의 stdin, stdout, 그리고 stderr를 통해 데이터를 흘리는 것이 가능하다.

자식 프로세스는 require('child_process').spawn() 를 이용해 생성한다.

자식프로세스는 항상 3개의 스트림, child.stdin, child.stdout 그리고 child.stderr와 연관되어있다.

ChildProcess?EventEmitter? 이다.

Event: 'exit' function(code, signal){}

이 이벤트는 자식 프로세스가 종료된 후에 생성된다. 프로세스가 정상적으로 종료된 경우, code는 프로세스 종료 코드이다. 아니면 null 이다. 프로세스가 시그널을 받고 종료하면 시그널은 그 시스널의 문자열 이름이다. 그렇지 않으면 null 이다.

이 이벤트가 생성된이후, 'output'과 'error' 콜백은 더이상 없다. waitpid(2) 를 참조하라.

child.stdin

자식 프로세스의 stdin을 표현하는 Writable Stream 이다. 많은 경우, end()를 통해 이 스트림을 닫으면 자식 프로세스가 종료되는 원인이 된다.

child.stdout

자식 프로세스의 stdout를 표현하는 Readable Stream 이다.

child.stderr

자식 프로세스의 stderr를 표현하는 Readable Stream 이다.

child.pid

자식 프로세스의 PID.

샘플

var spawn = require('child_process').spawn,
    grep  = spawn('grep', ['ssh']);

console.log('Spawned child pid: ' + grep.pid);
grep.stdin.end();

child_process.spawn(commond, args=[], [option])

주어진 command로 새 프로세스를 실행한다. args에 컴맨드라인 인자를 준다. 생략하면 args는 빈배열이 기본값이다. 3번째 인수는 추가옵션지정에 사용되고, 기본적으론 :

{ cwd: undefined
, env: process.env,
, customFds: [-1, -1, -1]
}

cwd는 시작된 프로세스의 작업 디렉토리를 지정할 수 있다. env는 새로운 프로세스에 보이는 환경 변수를 지정하는데 사용한다. customFds는 새로운 프로세스의 [stdin, stout, stderr] 를 기존의 스트림에 연결하는 것을 허용합니다. -1은 새로운 스트림이 만들어져야 한다는걸 의미한다.

ls -lh /usr를 실행, stdout, stderr 및 exit code를 검색하는 예제:

var sys   = require('sys'),
    spawn = require('child_process').spawn,
    ls    = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', function (data) {
  sys.print('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
  sys.print('stderr: ' + data);
});

ls.on('exit', function (code) {
  console.log('child process exited with code ' + code);
});

exec실패를 확인하는 예제:

var spawn = require('child_process').spawn,
    child = spawn('bad_command');

child.stderr.on('data', function (data) {
  if (/^execvp\(\)/.test(data.asciiSlice(0,data.length))) {
    console.log('Failed to start child process.');
  }
});

child_process.exec() 를 참조한다.

child_process.exec(command, [options], callback)

명령어를 자식프로세스, 출력버퍼로 실행하고 그것을 모든 콜백에 반환하는 고수준의 방법이다.

var sys   = require('sys'),
    exec  = require('child_process').exec,
    child;

child = exec('cat *.js bad_file | wc -l', 
  function (error, stdout, stderr) {
    sys.print('stdout: ' + stdout);
    sys.print('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

콜백은 인자(error, stdout, stderr)를 얻는다. 성공시 error는 null일 것이다. 에러시에는 error는 Error의 인스턴스이고, err.code는 자식 프로세스의 종료코드 일것이다. 그리고 err.signal은 프로세스를 종료시키는 시그널이다.

임의의 두번째 인자로 몇가지 옵션을 지정할 수 있다. 옵션의 기본값은:

{ encoding: 'utf8'
, timeout: 0
, maxBuffer: 200*1024
, killSignal: 'SIGKILL'
, cwd: null
, env: null
}

timeout이 0보다 크면, 자식 프로세스 실행 시간이 timeout 밀리초보다 길때 kill한다. 자식 프로세스는 KillSignal?에서Kill된다. maxBuffer 는 stdout이나 stderr의 데이터 최대 량을 정의한다. - 이 값을 초과하면 자식 프로세스는 Kill됩니다.

child.kill(signal='SIGTERM')

자식 프로세스에 신호를 보낸다. 인수가 없다면, 자식프로세스는 'SIGTERM"를 받게 된다. 가능한 신호 목록은 SIGNAL(7)을 참조.

var spawn = require('child_process').spawn,
    grep  = spawn('grep', ['ssh']);

grep.on('exit', function (code, signal) {
  console.log('child process terminated due to receipt of signal '+signal);
});

// send SIGHUP to process
grep.kill('SIGHUP');

이 함수는 KILL이라 불리우지만, 실제로 전달되는 신호는 자식 프로세스를 죽이지 않는다. kill은 단지 프로세스에 신호를 보낼뿐이다. 널을 보낼 뿐이다.

kill(2)를 참조.

Script

Script는 JavasScript? 코드를 컴파일하고 실행하는 클래스이다. 다음처럼 접근할 수 있다.

var Script = process.binding('evals').Script;

새로운 JavaScript? 코드는 컴파일되어 즉시 실행되거나 컴파일 및 저장하여 나중에 실행된다.

Script.runInThisContext(code, [filename])

process.compile과 유사하다. Script.runInThisContext는 code를 filename에서 로드된 것처럼 컴파일하여 실행 결과를 반환한다. 실행되는 코드는 로컬 범위에 액세스할 수 없다. filename은 옵션이다.

Script.runInThisContext과 eval에서 동일한 코드를 실행하는 방법 :

var localVar = 123,
    usingscript, evaled,
    Script = process.binding('evals').Script;

usingscript = Script.runInThisContext('localVar = 1;',  'myfile.js');
console.log('localVar: ' + localVar + ', usingscript: ' +  usingscript);
evaled = eval('localVar = 1;');
console.log('localVar: ' + localVar + ', evaled: ' +  evaled);

// localVar: 123, usingscript: 1
// localVar: 1, evaled: 1

Script.runInThisContext는 로컬 범위에 액세스하지 않는다. 그래서, localVar는 변경되지 않는다. eval은 로컬 범위에 액세스하기 때문에 localVar은 변경된다.

code 문법 오류가되는 경우는 Script.runInThisContext는 표준 오류에 문법 오류를 출력하고, 예외를 throw한다.

Script.runInNewContext(code, [sandbox], [filename])

Script.runInNewContext는 code를 filename에서 로드된 것처럼 컴파일하고 그것을 sandbox에서 실행하여 결과를 반환한다. 실행되는 코드는 로컬 범위에 액세스하지 않고, sandbox가 code에있어서의 글로벌 개체로 사용됩니다. sandbox 및 filename은 옵션이다.

예 : 전역 변수를 증가하여 새 값을 설정하는 코드를 컴파일하고 실행한다.

var util = require('util'),
    Script = process.binding('evals').Script,
    sandbox = {
      animal: 'cat',
      count: 2
    };

Script.runInNewContext(
  'count += 1; name = "kitty"', sandbox, 'myfile.js');
console.log(util.inspect(sandbox));

// { animal: 'cat', count: 3, name: 'kitty' }

믿을 수 없는 코드의 실행은 대단한 주의가 필요한 위험한 일이다. 일시적인 전역변수 누수를 방지하기 위해선 Script.runInNewContext가 유용하지만, 믿을 수 없는 코드는 분리된 프로세스가 요구된다.

코드에 문법오류가 있으면, Script.runInThisContext는 문업오류를 출력하고 에외를 throw한다.

new Script(code, [filename])

new Script는 code를 filename에서 로드된 것처럼 컴파일하지만 실행하지는 않는다. 대신에 컴파일된 코드를 표현하는 Script 개체를 반환합니다. 이 스크립트는 아래의 메서드를 사용하여 나중에 여러 번 실행할 수 있다. 반환되는 스크립트는 어떤 전역 개체와도 연관되어 있지 않다. 각각을 실행하기 전에 연결함으로써 그대로 실행된다. filename은 옵션이다.

code 문법 오류가되는 경우는 new Script는 표준 오류에 문법 오류를 출력하고, 예외를 throw한다.

script.runInThisContext()

Script.runInThisContext (대문자 'S'에주의)과 비슷하지만, 컴파일된 Script 객체의 메소드이다. script.runInThisContent는 script 코드를 실행하고 그 결과를 반환한다. 실행된 코드는 로컬 범위에 액세스하지 않지만, global 개체 (v8 : 실제 컨텍스트)에 액세스한다.

script.runInThisContext를 사용하여 코드를 한 번만 컴파일하고 여러 번 실행하는 방법 :

var Script = process.binding('evals').Script,
    scriptObj, i;

globalVar = 0;

scriptObj = new Script('globalVar += 1', 'myfile.js');

for (i = 0; i < 1000 ; i += 1) {
  scriptObj.runInThisContext();
}

console.log(globalVar);

// 1000

script.runInNewContext([sandbox])

Script.runInNewContext (대문자 'S'에주의)과 비슷하지만, 컴파일된 Script 개체의 메서드이다. script.runInNewContext은 sandbox가 글로벌 개체인 것처럼 script 코드를 실행하고 그 결과를 반환한다. 실행되는 코드는 로컬 범위에 액세스하지 않는다. sandbox는 옵션이다.

예 : 전역 변수를 증가하여 설정하는 코드를 컴파일하여이 코드를 여러 번 실행한다. 이 전역 변수는 샌드 박스에 포함되어 있다.

var util = require('util'),
    Script = process.binding('evals').Script,
    scriptObj, i,
    sandbox = {
      animal: 'cat',
      count: 2
    };

scriptObj = new Script(
    'count += 1; name = "kitty"', 'myfile.js');

for (i = 0; i < 10 ; i += 1) {
  scriptObj.runInNewContext(sandbox);
}

console.log(util.inspect(sandbox));

// { animal: 'cat', count: 12, name: 'kitty' }

믿을 수 없는 코드의 실행은 대단한 주의가 필요한 위험한 일이다.

일시적인 전역변수 누수를 방지하기 위해선 script.runInNewContext가 유용하지만, 믿을 수 없는 코드는 분리된 프로세스가 요구된다.

File System

File I / O는 POSIX 표준 함수에 대한 간단한 래퍼로 제공된다. 이 모듈을 사용하려면 require ( 'fs')를 한다. 모든 메소드는 비동기와 동기의 형식이 있다.

비동기 형식은 항상 마지막 인자로 완료 콜백을 받는다. 인수로 전달된 완료 콜백 메서드에 의존하지만, 최초의 인수는 항상 예외를 위해 예약되어 있다. 작업이 성공적으로 완료되면 첫 번째 인수는 null 또는 undefined 이다

비동기 버전의 예 :

var fs = require('fs');

fs.unlink('/tmp/hello', function (err) {
  if (err) throw err;
  console.log('successfully deleted /tmp/hello');
});

동기화 버전의 예 :

var fs = require('fs');

fs.unlinkSync('/tmp/hello')
console.log('successfully deleted /tmp/hello');

비동기 메소드는 순서를 보장하지 않는다. 그래서 다음과 같은 오류가 나기 쉽다.

fs.rename('/tmp/hello', '/tmp/world', function (err) {
  if (err) throw err;
  console.log('renamed complete');
});
fs.stat('/tmp/world', function (err, stats) {
  if (err) throw err;
  console.log('stats: ' + JSON.stringify(stats));
});

fs.stat는 fs.rename보다 먼저 실행되는 수도 있다. 정확한 방법은 콜백을 연결하는 것다.

fs.rename('/tmp/hello', '/tmp/world', function (err) {
  if (err) throw err;
  fs.stat('/tmp/world', function (err, stats) {
    if (err) throw err;
    console.log('stats: ' + JSON.stringify(stats));
  });
});

잦은 프로세스에서는 프로그래머가 이런 호출의 비동기 버전을 사용할걸 강력히 권한다. 동기화 버전은 그들이 완료될 때까지 프로세스를 차단한다. 모든 연결을 중단한다.

fs.rename(path1, path2, [callback])

비동기 rename (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.renameSync(path1, path2)

동기화 rename (2).

fs.truncate(fd, len, [callback])

비동기 ftruncate (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.truncateSync(fd, len)

동기화 ftruncate (2).

fs.chmod(path, mode, [callback])

비동기 chmod (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.chmodSync(path, mode)

동기화 chmod (2).

fs.stat(path, [callback])

비동기 stat (2). 콜백은 2 개의 인수(err, stats)를 받는다. stats는 fs.Stats 개체이다. 다음과 같다.

{ dev: 2049
, ino: 305352
, mode: 16877
, nlink: 12
, uid: 1000
, gid: 1000
, rdev: 0
, size: 4096
, blksize: 4096
, blocks: 8
, atime: '2009-06-29T11:11:55Z'
, mtime: '2009-06-29T11:11:40Z'
, ctime: '2009-06-29T11:11:40Z' 
}

더 자세한 사항은 아래의 fs.Stats 절을 참조.

fs.lstat(path, [callback])

비동기 lstat (2). 콜백은 2 개의 인수(err, stats)를 받는다. stats는 fs.Stats 개체이다. 다음과 같다.

fs.fstat(fd, [callback])

비동기 fstat (2). 콜백은 2 개의 인수(err, stats)를 받는다. stats는 fs.Stats 개체이다. 다음과 같다.

fs.statSync(path)

동기화 stat (2). fs.Stats의 인스턴스를 반환한다.

fs.lstatSync(path)

동기화 lstat (2). fs.Stats의 인스턴스를 반환한다.

fs.fstatSync(fd)

동기화 fstat (2). fs.Stats의 인스턴스를 반환한다.

fs.link(srcpath, dstpath, [callback])

비동기 link (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.linkSync(dstpath, srcpath)

동기화 link (2).

fs.symlink(linkdata, path, [callback])

비동기 symlink (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.symlinkSync(linkdata, path)

동기화 symlink (2).

fs.readlink(path, [callback])

비동기 readlink (2). 콜백은 2 개의 인수 (err, resolvedPath) 를 받는다.

fs.readlinkSync(path)

동기화 readlink (2). 수정된 경로를 반환한다.

fs.realpath(path, [callback])

비동기 realpath (2). 콜백은 2 개의 인수 (err, resolvedPath)를 받는다.

fs.realpathSync(path)

동기화 realpath (2). 수정된 경로를 반환한다.

fs.unlink(path, [callback])

비동기 unlink (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.unlinkSync(path) 동기화 unlink (2).

fs.rmdir(path, [callback])

비동기 rmdir (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.rmdirSync(path)

동기화 rmdir (2).

fs.mkdir(path, mode, [callback])

비동기 mkdir (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.mkdirSync(path, mode)

동기화 rmdir (2).

fs.readdir(path, [callback])

비동기 readdir (3). 디렉토리의 내용을로드한다. 콜백은 2 개의 인수(err, files)를 받는다. files 는 '..' 과 '.' 를 제외한 디렉토리 안의 파일 이름의 배열이다.

fs.readdirSync(path)

동기화 readdir (3). '..' 과 '.' 를 제외한 파일이름들의 배열을 반환한다.

fs.close(fd, [callback])

비동기 close (2). 완료 콜백에는 발생가능한 예외 이외에는 인수가 전달되지 않는다.

fs.closeSync(fd)

동기화 close (2).

fs.open(path, flags, mode=0666, [callback])

비동기 파일 열기. open (2)를 참조하십시오. 플래그는 'r', 'r', 'w', 'w', 'a'또는 'a+'. 콜백은 2 개의 인수(err, fd)를 받는다.

fs.openSync(path, flags, mode=0666)

동기화 open (2).

fs.write(fd, buffer, offset, length, position, [callback])

fd로 지정된 파일에 buffer를 쓴다.

offset 및 length에서 버퍼의 어느 부분이 기록되는 여부가 결정된다.

position은 데이터가 기록되는 위치를 파일의 시작 부분에서 오프셋을 나타낸다. position이 null이면, 데이터는 현재 위치에서 기록된다. pwrite (2)를 참조.

콜백은 2 개의 인수(err, written)가 주어진다. written는 기록된 bytes 를 나타낸다.

fs.writeSync(fd, buffer, offset, length, position)

버퍼 기반 fs.write() 의 동기화버전. 기록된 바이트수를 반환한다.

fs.writeSync(fd, str, position, encoding='utf8')

문자열 기반 fs.write() 의 동기화 버전. 기록된 바이트 수를 반환한다.

fs.read(fd, buffer, offset, length, position, [callback])

fd로 지정된 파일에서 데이터를 읽는다.

buffer는 데이터를 쓸 버퍼다.

offset은 쓰기를 시작할 버퍼의 오프셋이다.

length는 읽어들이는 바이트 수를 지정하는 정수이다.

position은 파일의 로드를 시작할 위치를 지정하는 정수이다. position이 null의 경우, 데이터는 현재 위치에서로드된다.

callback은 두개이 인수(err, bytesRead)를 받는다.

fs.readSync(fd, buffer, offset, length, position)

버퍼 기반 fs.read의 동기화 버전. bytesRead 수를 반환한다.

fs.readSync(fd, length, position, encoding)

문자열 기반 fs.read 의 동기화버전. bytesRead 수를 반환한다.

fs.readFile(filename, [encoding], [callback])

파일의 전체 내용을 비동기적으로 로드한다. 예 :

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

콜백은 2 개의 인수(err, data)를 전달한다. data는 파일의 내용이다.

인코딩이 지정되지 않으면, 실 버퍼(raw buffer)가 전달 된다.


fs.readFileSync(filename, [encoding]) 

fs.readFile  의 동기화 버전 파일내용을 반환한다. 

인코딩을 지정하면 문자열을 반환하지만 그렇지 않으면 버퍼를 반환한다. 

fs.writeFile(filename, data, encoding='utf8', [callback]) 

파일에 비동기적으로 데이터를 쓴다.  data 는 문자열이나 버퍼일 수 있다. 

예:

fs.writeFile('message.txt', 'Hello Node', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
});

fs.writeFileSync(filename, data, encoding='utf8') 

fs.writeFile의 동기화 버전

fs.watchFile(filename, [options], listener) 

filename의 변경을 감시한다. 콜백  listener는 파일 변경 때 만다 호출된다.

두번째 인수를 선택사항이다. 이 options가 주어지면, 객체는 2개의 boolean 멤버, persistent, interval(폴링 간격 밀리초)를 가져야 한다. 기본값은  {persistent: true, interval: 0} 이다. 

listener는 현재상태의 객체와 이전 상태의 객체 두개의 인수를 받는다. 

fs.watchFile(f, function (curr, prev) {
  console.log('the current mtime is: ' + curr.mtime);
  console.log('the previous mtime was: ' + prev.mtime);
});

상태 객체는 fs.Stat의 인스턴스이다. 

fs.unwatchFile(filename) 

filename 변경에 대한 감시를 멈춘다. 

DNS

이 모듈에 액세스하려면 require ( 'dns')를 사용한다.

여기, 'www.google.com'을 풀이(resolve)하여, 반환되는 IP주소를 역방향 풀이(reverse resolves)하는 하는 예가 있다.

google.com도메인을 분석하여 파악한 아이피로 다시 도메인을 알아내는 예시다..

var dns = require('dns');

dns.resolve4('www.google.com', function (err, addresses) {
  if (err) throw err;

  console.log('addresses: ' + JSON.stringify(addresses));

  addresses.forEach(function (a) {
    dns.reverse(a, function (err, domains) {
      if (err) {
        console.log('reverse for ' + a + ' failed: ' +
          err.message);
      } else {
        console.log('reverse for ' + a + ': ' +
          JSON.stringify(domains));
      }
    });
  });
});

dns.lookup(domain, family=null, callback)

도메인 (예 'google.com')를 풀이(resolve)하여 처음 발견된 A (IPv4) 또는 AAAA (IPv6) 기록한다.

콜백은 인수 err, address, family 를 가지고 있다. address 인수는 IP v4 또는 v6 주소 표기 문자열이다. family 인수는 4,6 정수 중 하나이고 address 와 쌍이다. (이 값은 반드시 먼저 lookup 에 전달할 필요는 없다. )

dns.resolve(domain, rrtype='A', callback)

rrtype이 명시된 레코드 타입 배열의 도메인(예 'google.com') 풀이. 유효한 rrtype은 A (IPV4 주소) AAAA (IPV6 주소) MX (mail exchange 레코드), TXT (텍스트 레코드), SRV (SRV 레코드), PTR (IP를 역방향으로 조회하는 데 사용된다) 이다.

콜백은 인수 err, addresses 를 가진다. addresses 각 항목의 타입은 레코드 타입에 의해 결정되고, 해당조회 방법은 아래 문서에 설명되어있다.

오류 발생시, err Error 개체의 인스턴스이며, err.errno 은 아래 오류 코드 중 하나이고 err.message 는 영문 에러 문자열이다.

dns.resolve4(domain, callback)

dns.resolve() 과 같다. 단, IPv4 질의(A 레코드들)만 지원한다. addresses 는 IPv4 주소 배열이다. (예. ['74.125.79.104', '74.125.79.105', '74.125.79.106'] ).

dns.resolve6(domain, callback)

IPv6 질의(AAAA 질의) 인것 제외하고는 dns.resolve4() 와 동일하다.

dns.resolveMx(domain, callback)

dns.resolve() 과 같다. 단, mail exchange 질의(MX 레코드들)만 지원한다.

addresses 는 MX 레코드 배열로, 각각은 priority와 exchange 속성을 갇는다. (예. [{'priority': 10, 'exchange': 'mx.example.com'},...] ).

dns.resolveTxt(domain, callback)

dns.resolve()와 같다. 단, 텍스트 질의(TXT 레코드들)만 지원한다. addressesdomain에서 가능한 텍스트 레코드 배열이다. (예,  v=spf1 ip4:0.0.0.0 ~all?).

dns.resolveSrv(domain, callback)

dns.resolve()와 같다. 단, 서비스 레코드(SRV 레코드들)만 지원한다. addressesdomain에서 가능한 SRV 레코드들 배열이다. SRV 레코드의 속성은 weight, port, name이다. (예, [{'priority': 10, {'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...]).

dns.reverse(ip, callback)

IP주소로 도메인명 배열을 역방향 풀이(resolves)한다.

콜백은 err, domains 인수를 가진다.

에러가 발생하면 err은 null이 아닌 Error 객체의 인스턴스이다.

각 DNS 질의는 에러코드를 반환할 수 있다.

  • dns.TEMPFAIL: 타임아웃, SERVFAIL 또는 이와 유사한것.
  • dns.PROTOCOL: 알수 없는 응답.
  • dns.NXDOMAIN: 도메인이 존재하지 않음
  • dns.NODATA: 도메인이 존재하지만, 데이터 없음
  • dns.NOMEM: 과정에서 메모리가 부족.
  • dns.BADQUERY: 질의의 형식 오류.

dgram

데이터그램 소캣들은 require ( 'dgram')에서 사용할 수 있다. 데이터그램은 대부분의 경우 IP / UDP 메시지 처리되지만 UNIX 도메인 소켓을 사용할 수 있다.

Event: 'message' function (msg, rinfo) { }'

소켓에 새 데이터 그램이 도착했을 때 생성된다. msgBuffer이고, rinfo는 발신자 주소정보와 데이터그램의 사이즈(bytes)를 가진 객체이다.

Event: 'listening' function () { }

소켓이 데이터그램 수신을 시작할때 생성된다. 이것은 UDP 소켓이 작성되는 즉시 발생한다. UNIX 도메인 소켓은 bind ()를 호출할 때까지 리스닝을 시작하지 않는다.

Event: 'close' function () { }

close()이 소켓을 받을 때 생성된다. 이 소켓은 새로운 message 이벤트가 생성되지 않는다.

dgram.createSocket(type, [callback])

지정된 형식의 데이터그램을 만든다. 유효한 타입은 udp4, udp6, ,unix_dgram이다.

message 이벤트 리스너가 더해진 콜백으로 이동한다. 필수는 아니다.

dgram.send(buf, offset, length, path, [callback])

UNIX 도메인의 데이터그램 소켓 용. 수신지 종단 주소는 파일 시스템의 경로명이다. 옵션인 콜백은 OS에서 sendto 호출이 완료된 후에 시작되기 위하여 제공된다. 콜백이 호출될 때까지 buf 재사용은 안전하지 않다. bind()로 소켓이 경로명에 바인딩되지 않는 한, 이 소켓으로 메시지를 받을 수 없다는 것에 주의.

Unix 도메인소켓 /var/run/syslog로 OSX에서 syslogd에 메세지를 보내는 예제:

var dgram = require('dgram');
var message = new Buffer("A message to log.");
var client = dgram.createSocket("unix_dgram");
client.send(message, 0, message.length, "/var/run/syslog",
  function (err, bytes) {
    if (err) {
      throw err;
    }
    console.log("Wrote " + bytes + " bytes to socket.");
});

dgram.send(buf, offset, length, port, address, [callback])

UDP 소켓 용. 수신지 종단의 포트와 IP주소는 필수다. address인자에 문자열을 넘기면, DNS와 해결된다. DNS 오류 발생시 와 buf가 재사용 가능하게 된 경우를 위해 콜백을 지정할 수 있다. 콜백은 옵션이다. DNS 조회는 발신시간을 (적어도 다음 Tick 까지) 지연시킬것이란 걸 참고하라. 발신을 했다는 것을 확실히 아는 유일한 방법은 콜백을 사용하는 것이다.

localhost 에서 임의의 포트로 UDP 패킷을 발신하는 예제.

var dgram = require('dgram');
var message = new Buffer("Some bytes");
var client = dgram.createSocket("udp4");
client.send(message, 0, message.length, 41234, "localhost");
client.close();

dgram.bind(path)

UNIX 도메인 데이타그램 소켓용. path로 명시된 소켓에서 데이터그램의 수신대기를 시작한다. 클라이언트는 bind()없이 send() 할수 있지만, bind() 없이 데이타그램을 수실하진 않는다.

수신한 모든 메세지를 반향하는 Unix 도메인 데이타그램의 예제.

var dgram = require("dgram");
var serverPath = "/tmp/dgram_server_sock";
var server = dgram.createSocket("unix_dgram");

server.on("message", function (msg, rinfo) {
  console.log("got: " + msg + " from " + rinfo.address);
  server.send(msg, 0, msg.length, rinfo.address);
});

server.on("listening", function () {
  console.log("server listening " + server.address().address);
})
 
server.bind(serverPath);

이 서버와 통신하는 UNIX 도메인 데이타그램 클라이언트 예제.

var dgram = require("dgram");
var serverPath = "/tmp/dgram_server_sock";
var clientPath = "/tmp/dgram_client_sock";

var message = new Buffer("A message at " + (new Date()));

var client = dgram.createSocket("unix_dgram");

client.on("message", function (msg, rinfo) {
  console.log("got: " + msg + " from " + rinfo.address);
});

client.on("listening", function () {
  console.log("client listening " + client.address().address);
  client.send(message, 0, message.length, serverPath);
});

client.bind(clientPath);

dgram.bind(port, [address])

UDP 소켓용. 명명된 port과 옵셩인 address 데이터 그램을 수신대기 한다. address가 지정되지 않으면 OS 는 모두 address에서 수신을 시도할것이다.

41234 포트에서 수신 대기하는 UDP 서버 예제.

var dgram = require("dgram");

var server = dgram.createSocket("udp4");
var messageToSend = new Buffer("A message to send");

server.on("message", function (msg, rinfo) {
  console.log("server got: " + msg + " from " +
    rinfo.address + ":" + rinfo.port);
});

server.on("listening", function () {
  var address = server.address();
  console.log("server listening " +
      address.address + ":" + address.port);
});

server.bind(41234);
// server listening 0.0.0.0:41234

dgram.close()

하층 소켓을 닫고 여기서 데이터의 수시대기를 중지한다. 비록 bind() 가 호출되지 않더라도, UDP 소켓은 자동으로 메세지를 기다린다.

dgram.address()

소켓의 주소 정보를 가지고 있는 객체를 반환한다. UDP 소켓에서 이 객체는 addressport를 가지고 있다. UNIX 도메인 소켓에서는 address만 가지고 있다.

dgram.setBroadcast(flag)

소켓 옵션 SO_BROADCAST을 설정하거나 해제합니다(복수개). 이 옵션을 세팅하면, UDP 패킷은 로컬 인터페이스의 브로드 캐스트를위한 주소로 발신된다.

dgram.setTTL(ttl)

소켓 옵션의 IP_TTL을 설정한다. TTL은 "수명"을 나타내지만, 이 컨텍스트에서는 패킷 통과를 허용하는 IP 홉 수를 지정한다. 각 라우터 또는 게이트웨이 패킷을 전달하기 위해 TTL을 감소시킨다. 라우터에서 TTL 이 0으로 감소하면, 그것은 전달되지 않는다. TTL 값변경은 일반적으로 네트워크 조사와 멀티 캐스트로 사용된다.

setTTL() 의 인자는 1~255의 홉 수이다. 기본값은 대부분 시스템이 64이다.