nodeJSの練習
参考情報
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
RHEL/CentOS/Scientific Linux 6
インストール
[ec2-user]# yum update [ec2-user]# yum install nodejs npm --enablerepo=epel Loaded plugins: amazon-id, rhui-lb, security Error getting repository data for epel, repository not found [ec2-user]# sudo rpm --import https://fedoraproject.org/static/0608B895.txt [ec2-user]# rpm -Uvh http://download-i2.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm [ec2-user]# yum install nodejs npm --enablerepo=epel
動作確認
nodeとすると、プロンプトが開きます。printという関数はないようです。
[ec2-user]# node > console.log("aa") aa undefined > print (1+2) ReferenceError: print is not defined at repl:1:2 at REPLServer.self.eval (repl.js:110:21) at Interface.<anonymous> (repl.js:239:12) at Interface.EventEmitter.emit (events.js:95:17) at Interface._onLine (readline.js:202:10) at Interface._line (readline.js:531:8) at Interface._ttyWrite (readline.js:760:14) at ReadStream.onkeypress (readline.js:99:10) at ReadStream.EventEmitter.emit (events.js:98:17) at emitKey (readline.js:1095:12) > { foo : 1 , bar :2 } { foo: 1, bar: 2 } > a = { foo : 1 , bar :2 } { foo: 1, bar: 2 } > console.log(a) { foo: 1, bar: 2 } undefined
サーバをたててみる
ファイル名:myserver.js
var http = require('http'); console.log(" ===== http ======"); console.log(http); var server = http.createServer(function(req, res){ console.log(" ===== request ======"); console.log(req); res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello World\n'); res.end(); }); console.log(" ===== server ======"); console.log(server); server.listen(80);
サーバの実行
サーバやリクエストのオブジェクトは、意外にも大きいようです。
[nodejs]# node myserver.js ===== http ====== { parsers: { name: 'parsers', constructor: [Function], max: 1000, list: [] }, STATUS_CODES: { '100': 'Continue', '101': 'Switching Protocols', '102': 'Processing', '200': 'OK', '201': 'Created', '202': 'Accepted', '203': 'Non-Authoritative Information', '204': 'No Content', '205': 'Reset Content', '206': 'Partial Content', '207': 'Multi-Status', '300': 'Multiple Choices', '301': 'Moved Permanently', '302': 'Moved Temporarily', '303': 'See Other', '304': 'Not Modified', '305': 'Use Proxy', '307': 'Temporary Redirect', '400': 'Bad Request', '401': 'Unauthorized', '402': 'Payment Required', '403': 'Forbidden', '404': 'Not Found', '405': 'Method Not Allowed', '406': 'Not Acceptable', '407': 'Proxy Authentication Required', '408': 'Request Time-out', '409': 'Conflict', '410': 'Gone', '411': 'Length Required', '412': 'Precondition Failed', '413': 'Request Entity Too Large', '414': 'Request-URI Too Large', '415': 'Unsupported Media Type', '416': 'Requested Range Not Satisfiable', '417': 'Expectation Failed', '418': 'I\'m a teapot', '422': 'Unprocessable Entity', '423': 'Locked', '424': 'Failed Dependency', '425': 'Unordered Collection', '426': 'Upgrade Required', '428': 'Precondition Required', '429': 'Too Many Requests', '431': 'Request Header Fields Too Large', '500': 'Internal Server Error', '501': 'Not Implemented', '502': 'Bad Gateway', '503': 'Service Unavailable', '504': 'Gateway Time-out', '505': 'HTTP Version Not Supported', '506': 'Variant Also Negotiates', '507': 'Insufficient Storage', '509': 'Bandwidth Limit Exceeded', '510': 'Not Extended', '511': 'Network Authentication Required' }, IncomingMessage: { [Function: IncomingMessage] super_: { [Function: Readable] ReadableState: [Function: ReadableState], super_: [Object], _fromList: [Function: fromList] } }, OutgoingMessage: { [Function: OutgoingMessage] super_: { [Function: Stream] super_: [Object], Readable: [Object], Writable: [Object], Duplex: [Object], Transform: [Object], PassThrough: [Object], Stream: [Circular] } }, ServerResponse: { [Function: ServerResponse] super_: { [Function: OutgoingMessage] super_: [Object] } }, Agent: { [Function: Agent] super_: { [Function: EventEmitter] listenerCount: [Function] }, defaultMaxSockets: 5 }, globalAgent: { domain: null, _events: { free: [Function] }, _maxListeners: 10, options: {}, requests: {}, sockets: {}, maxSockets: 5, createConnection: [Function] }, ClientRequest: { [Function: ClientRequest] super_: { [Function: OutgoingMessage] super_: [Object] } }, request: [Function], get: [Function], Server: { [Function: Server] super_: { [Function: Server] super_: [Object] } }, createServer: [Function], _connectionListener: [Function: connectionListener], Client: [Function: deprecated], createClient: [Function: deprecated] } ===== server ====== { domain: null, _events: { request: [Function], connection: [Function: connectionListener], clientError: [Function] }, _maxListeners: 10, _connections: 0, connections: [Getter/Setter], _handle: null, _usingSlaves: false, _slaves: [], allowHalfOpen: true, httpAllowHalfOpen: false, timeout: 120000 } ===== request ====== { _readableState: { highWaterMark: 16384, buffer: [], length: 0, pipes: null, pipesCount: 0, flowing: false, ended: false, endEmitted: false, reading: false, calledRead: false, sync: true, needReadable: false, emittedReadable: false, readableListening: false, objectMode: false, defaultEncoding: 'utf8', ranOut: false, awaitDrain: 0, readingMore: false, decoder: null, encoding: null }, readable: true, domain: null, _events: {}, _maxListeners: 10, socket: { _connecting: false, _handle: { fd: 11, writeQueueSize: 0, owner: [Circular], onread: [Function: onread], reading: true }, _readableState: { highWaterMark: 16384, buffer: [], length: 0, pipes: null, pipesCount: 0, flowing: false, ended: false, endEmitted: false, reading: true, calledRead: true, sync: false, needReadable: true, emittedReadable: false, readableListening: false, objectMode: false, defaultEncoding: 'utf8', ranOut: false, awaitDrain: 0, readingMore: false, decoder: null, encoding: null }, readable: true, domain: null, _events: { end: [Object], finish: [Function: onSocketFinish], _socketEnd: [Function: onSocketEnd], drain: [Object], timeout: [Function], error: [Function], close: [Object] }, _maxListeners: 10, _writableState: { highWaterMark: 16384, objectMode: false, needDrain: false, ending: false, ended: false, finished: false, decodeStrings: false, defaultEncoding: 'utf8', length: 0, writing: false, sync: true, bufferProcessing: false, onwrite: [Function], writecb: null, writelen: 0, buffer: [], errorEmitted: false }, writable: true, allowHalfOpen: true, onend: [Function], destroyed: false, bytesRead: 350, _bytesDispatched: 0, _pendingData: null, _pendingEncoding: '', server: { domain: null, _events: [Object], _maxListeners: 10, _connections: 1, connections: [Getter/Setter], _handle: [Object], _usingSlaves: false, _slaves: [], allowHalfOpen: true, httpAllowHalfOpen: false, timeout: 120000, _connectionKey: '4:0.0.0.0:80' }, _idleTimeout: 120000, _idleNext: { _idleNext: [Circular], _idlePrev: [Circular] }, _idlePrev: { _idleNext: [Circular], _idlePrev: [Circular] }, _idleStart: 1403336349410, parser: { _headers: [], _url: '', onHeaders: [Function: parserOnHeaders], onHeadersComplete: [Function: parserOnHeadersComplete], onBody: [Function: parserOnBody], onMessageComplete: [Function: parserOnMessageComplete], socket: [Circular], incoming: [Circular], maxHeaderPairs: 2000, onIncoming: [Function] }, ondata: [Function], _paused: false, _httpMessage: { domain: null, _events: [Object], _maxListeners: 10, output: [], outputEncodings: [], writable: true, _last: false, chunkedEncoding: false, shouldKeepAlive: true, useChunkedEncodingByDefault: true, sendDate: true, _headerSent: false, _header: '', _hasBody: true, _trailer: '', finished: false, _hangupClose: false, socket: [Circular], connection: [Circular] } }, connection: { _connecting: false, _handle: { fd: 11, writeQueueSize: 0, owner: [Circular], onread: [Function: onread], reading: true }, _readableState: { highWaterMark: 16384, buffer: [], length: 0, pipes: null, pipesCount: 0, flowing: false, ended: false, endEmitted: false, reading: true, calledRead: true, sync: false, needReadable: true, emittedReadable: false, readableListening: false, objectMode: false, defaultEncoding: 'utf8', ranOut: false, awaitDrain: 0, readingMore: false, decoder: null, encoding: null }, readable: true, domain: null, _events: { end: [Object], finish: [Function: onSocketFinish], _socketEnd: [Function: onSocketEnd], drain: [Object], timeout: [Function], error: [Function], close: [Object] }, _maxListeners: 10, _writableState: { highWaterMark: 16384, objectMode: false, needDrain: false, ending: false, ended: false, finished: false, decodeStrings: false, defaultEncoding: 'utf8', length: 0, writing: false, sync: true, bufferProcessing: false, onwrite: [Function], writecb: null, writelen: 0, buffer: [], errorEmitted: false }, writable: true, allowHalfOpen: true, onend: [Function], destroyed: false, bytesRead: 350, _bytesDispatched: 0, _pendingData: null, _pendingEncoding: '', server: { domain: null, _events: [Object], _maxListeners: 10, _connections: 1, connections: [Getter/Setter], _handle: [Object], _usingSlaves: false, _slaves: [], allowHalfOpen: true, httpAllowHalfOpen: false, timeout: 120000, _connectionKey: '4:0.0.0.0:80' }, _idleTimeout: 120000, _idleNext: { _idleNext: [Circular], _idlePrev: [Circular] }, _idlePrev: { _idleNext: [Circular], _idlePrev: [Circular] }, _idleStart: 1403336349410, parser: { _headers: [], _url: '', onHeaders: [Function: parserOnHeaders], onHeadersComplete: [Function: parserOnHeadersComplete], onBody: [Function: parserOnBody], onMessageComplete: [Function: parserOnMessageComplete], socket: [Circular], incoming: [Circular], maxHeaderPairs: 2000, onIncoming: [Function] }, ondata: [Function], _paused: false, _httpMessage: { domain: null, _events: [Object], _maxListeners: 10, output: [], outputEncodings: [], writable: true, _last: false, chunkedEncoding: false, shouldKeepAlive: true, useChunkedEncodingByDefault: true, sendDate: true, _headerSent: false, _header: '', _hasBody: true, _trailer: '', finished: false, _hangupClose: false, socket: [Circular], connection: [Circular] } }, httpVersion: '1.1', complete: false, headers: { host: ‘xx.xxx.xxx.xxx’, 'accept-encoding': 'gzip, deflate', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_X_X) AppleWebKit/XXX.XX.X (KHTML, like Gecko) Version/7.0.2 Safari/XXX.XX.X’, 'accept-language': 'ja-jp', 'cache-control': 'max-age=0', connection: 'keep-alive' }, trailers: {}, _pendings: [], _pendingIndex: 0, url: '/', method: 'GET', statusCode: null, client: { _connecting: false, _handle: { fd: 11, writeQueueSize: 0, owner: [Circular], onread: [Function: onread], reading: true }, _readableState: { highWaterMark: 16384, buffer: [], length: 0, pipes: null, pipesCount: 0, flowing: false, ended: false, endEmitted: false, reading: true, calledRead: true, sync: false, needReadable: true, emittedReadable: false, readableListening: false, objectMode: false, defaultEncoding: 'utf8', ranOut: false, awaitDrain: 0, readingMore: false, decoder: null, encoding: null }, readable: true, domain: null, _events: { end: [Object], finish: [Function: onSocketFinish], _socketEnd: [Function: onSocketEnd], drain: [Object], timeout: [Function], error: [Function], close: [Object] }, _maxListeners: 10, _writableState: { highWaterMark: 16384, objectMode: false, needDrain: false, ending: false, ended: false, finished: false, decodeStrings: false, defaultEncoding: 'utf8', length: 0, writing: false, sync: true, bufferProcessing: false, onwrite: [Function], writecb: null, writelen: 0, buffer: [], errorEmitted: false }, writable: true, allowHalfOpen: true, onend: [Function], destroyed: false, bytesRead: 350, _bytesDispatched: 0, _pendingData: null, _pendingEncoding: '', server: { domain: null, _events: [Object], _maxListeners: 10, _connections: 1, connections: [Getter/Setter], _handle: [Object], _usingSlaves: false, _slaves: [], allowHalfOpen: true, httpAllowHalfOpen: false, timeout: 120000, _connectionKey: '4:0.0.0.0:80' }, _idleTimeout: 120000, _idleNext: { _idleNext: [Circular], _idlePrev: [Circular] }, _idlePrev: { _idleNext: [Circular], _idlePrev: [Circular] }, _idleStart: 1403336349410, parser: { _headers: [], _url: '', onHeaders: [Function: parserOnHeaders], onHeadersComplete: [Function: parserOnHeadersComplete], onBody: [Function: parserOnBody], onMessageComplete: [Function: parserOnMessageComplete], socket: [Circular], incoming: [Circular], maxHeaderPairs: 2000, onIncoming: [Function] }, ondata: [Function], _paused: false, _httpMessage: { domain: null, _events: [Object], _maxListeners: 10, output: [], outputEncodings: [], writable: true, _last: false, chunkedEncoding: false, shouldKeepAlive: true, useChunkedEncodingByDefault: true, sendDate: true, _headerSent: false, _header: '', _hasBody: true, _trailer: '', finished: false, _hangupClose: false, socket: [Circular], connection: [Circular] } }, _consuming: false, _dumped: false, httpVersionMajor: 1, httpVersionMinor: 1, upgrade: false } [nodejs]#
サーバの終了
ポートを握ったままなので、再実行するとエラーになります。サーバプログラムをkillしてあげる必要がありました。
[ec2-user]# mkdir nodejs [ec2-user]# cd nodejs/ [nodejs]# ls [nodejs]# vim myserver.js [nodejs]# node myserver.js [nodejs]# ps au | grep node root 10952 0.0 2.6 717696 15780 pts/0 Sl+ 03:06 0:00 node root 11184 0.0 2.4 716668 14708 pts/1 Sl+ 03:28 0:00 node myserver.js root 11317 0.0 0.1 107456 944 pts/2 S+ 03:37 0:00 grep node [nodejs]# kill -p 11184 bash: kill: p: invalid signal specification [nodejs]# kill 11184 [nodejs]# ps au | grep node root 10952 0.0 2.6 717696 15780 pts/0 Sl+ 03:06 0:00 node root 11326 0.0 0.1 107456 940 pts/2 S+ 03:38 0:00 grep node