Node.js ã®ã¨ã©ã¼ãã³ããªã³ã°
JavaScript Advent Calendar 2011 (Node.js/WebSocketsã³ã¼ã¹) ã® 13 æ¥ç®ã®è¨äºã§ãï¼
Node ã¨ããã°éåæããã°ã©ãã³ã°ã§ããï¼ãã®ã¹ã¿ã¤ã«ã¯å¤§éæã«ãã㦠2 種é¡ããã¾ãï¼ä¸ã¤ç®ã¯ fs
ã¢ã¸ã¥ã¼ã«ãªã©ã§ä½¿ããã¦ããã³ã¼ã«ããã¯é¢æ°ã®ã¹ã¿ã¤ã«ï¼
fs.readFile(path, function(err, content) { if (err) { // ã¨ã©ã¼æã®å¦ç return; } // æåæã®å¦ç });
ãã®ã¹ã¿ã¤ã«ã¯ï¼ä½ããã®è¦æ±ã«å¯¾ããçµæãä¸çºã§åãåã (è¦æ±ã¨çµæã 1 対 1) å ´åã«ä½¿ããã¾ãï¼ããã¦ï¼ã³ã¼ã«ããã¯é¢æ°ã®ç¬¬1弿°ã§ã¨ã©ã¼ã®æç¡ãéç¥ããã¾ãï¼ã¨ã©ã¼ããªããã° null
ï¼ã¨ã©ã¼ããã£ãå ´å㯠Error
ãªãã¸ã§ã¯ãã¨ããã®ãååã®ãããªæ°ããã¾ããï¼undefined
ãæ¸¡ãããããããã¨ãï¼
ã³ã¼ã«ããã¯ã¹ã¿ã¤ã«ã®å ´åã¯éåæ API ã®å¼ã³åºãããã¹ãããããï¼ããã«ä¼´ã£ã¦ã¨ã©ã¼ãã³ããªã³ã°ãç ©éåããããã®ã§ããï¼ããã«ã¤ãã¦ã¯ã¨ã©ã¼ã®ã«ã¼ãã£ã³ã°ããã¦ãããããã¼å¶å¾¡ã¢ã¸ã¥ã¼ã«ã使ãã¨ãã£ããããã¯ãï¼ããã¼å¶å¾¡ã«ã¤ãã¦ã¯æ±äº¬ Node å¦å 1 æéç®ã§çºè¡¨ããè³æãåèã«ã©ãã¼ï¼
ãã® Advent Calendar 16 æ¥ç®ã§ Async (ãã¶ã caolan/async ã ãã) ãç´¹ä»ããããããªã®ã§ï¼ãã¡ããåèã«ãªãããããã¾ããï¼
ãã¦ï¼æ¬ã¨ã³ããªã®ä¸»é¡ã¯ããä¸ã¤ã®ã¹ã¿ã¤ã«ï¼EventEmitter
ã使ã£ãå ´åã®ã¨ã©ã¼ãã³ããªã³ã°ã«ã¤ãã¦ã§ãï¼EventEmitter
㯠Node.js ã®éåæ API ã«ããã䏿 ¸ã¨ãè¨ããã³ã³ãã¼ãã³ãã§ãï¼ããªãã¿ã®ãµã³ãã«:
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, "127.0.0.1"); console.log('Server running at http://127.0.0.1:1337/');
ãã®ä¸ã«åºã¦ãã req
ã res
(ããã㯠Advent Calendar 4 æ¥ç® ã§ç´¹ä»ãããã¹ããªã¼ã ã§ãããã¾ã) ã«å ãã¦ï¼http.createServer()
ã®æ»ãå¤ã EventEmitter
ã§ãï¼
EventEmitter
ã® emit(name, [args...])
ã¡ã½ãããå¼ã³åºããã¨ã§ï¼ã¤ãã³ããçæãããã¨ãã§ãã¾ãï¼ç¬¬ 1 弿°ãã¤ãã³ãåã«ãªãã¾ãï¼ãã㦠on(name, listener)
ã¾ã㯠once(name, listener)
ã§ã¤ãã³ããçºçããæã«å¼ã³åºãããããªã¹ãã颿° listener
ãç»é²ãããã¨ãã§ãã¾ãï¼once()
ã§ç»é²ãããªã¹ãã¯ä¸åº¦å¼ã³åºããã㨠EventEmitter
ããåãé¤ããã¾ãï¼on()
ã§ç»é²ãããªã¹ã㯠removeListener(name, listener)
ã§æç¤ºçã«åãé¤ãã¾ã§æå¹ã§ã (ã¡ã¢ãªãªã¼ã¯ã«æ³¨æï¼)ï¼
ã¨ãããã¨ã§ï¼ãããããªç¨®é¡ã®ã¤ãã³ããç¹°ãè¿ã (0 åãå«ã) çºçãããããªã±ã¼ã¹ã§ã¯ EventEmitter
ã使ããã¾ãï¼
ã¤ãã³ãåã«ã¯ä»»æã®æååã使ããã¨ãã§ãã¾ãï¼ã¹ããªã¼ã ã§ããªãã¿ãªã®ã¯ 'data'
ã 'end'
ã§ããï¼
ãããããæ¬é¡ã®æ¬é¡ï¼EventEmitter
ã«ã¯ä¸ã¤ã ãï¼ç¹å¥ã«æ±ãããã¤ãã³ãåãããã¾ãï¼ããã 'error'
ã§ãï¼ãã¡ããï¼ã¨ã©ã¼ãçºçãããã¨ãéç¥ããããã®ã¤ãã³ãåã§ãï¼
ã¾ãã¯ï¼ç°¡åãªãµã³ãã«ã§ 'error'
ã¤ãã³ããçºçããã¦ã¿ã¾ãããï¼
var events = require('events'); var emitter = new events.EventEmitter(); emitter.emit('error'); console.log('ãã ãããã');
å®è¡ãã¦ã¿ã¾ãï¼
$ node a.js node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: Uncaught, unspecified 'error' event. at EventEmitter.emit (events.js:50:15) at Object.<anonymous> (/tmp/a.js:4:9) at Module._compile (module.js:432:26) at Object..js (module.js:450:10) at Module.load (module.js:351:31) at Function._load (module.js:310:12) at Array.0 (module.js:470:10) at EventEmitter._tickCallback (node.js:192:40) $
ã¹ã¿ãã¯ãã¬ã¼ã¹ãåºåããã¦ãã¾ãã¾ãã (Advent Calendar 2 æ¥ç® ãåèã«ã©ãã¼)ï¼ããã¦æå¾ã® ããã
ãããããã表示ãããã¦ãã¾ããï¼ã¤ã¾ãï¼'error'
ã¤ãã³ããçºçããã¨ï¼Node ã¯ã¯ã©ãã·ã¥ãã¦ãã¾ãã®ã§ãï¼ï¼
ãªã¼ãã¦ãã¨ã¯ããã¾ããï¼ã¹ã¿ãã¯ãã¬ã¼ã¹ã«ã¡ããã¨åºã¦ã¾ããï¼ãUncaughtãã£ã¦ï¼'error'
ã¤ãã³ããçºçãããã¨ãåå ã§ã¯ãªãï¼'error'
ã¤ãã³ããæã¾ãã¦ããªããã¨ãåå ã§ããã»ã¹ã¯çµäºããã ããªã®ã§ãï¼
ãããªãæã¾ããã°ãããããªãï¼
var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('error', function() { console.log('ããã'); }); emitter.emit('error'); console.log('ãã ãããã');
å®è¡ãã¾ãããï¼
$ node b.js ããã ãã ãããã $
ç¡äºããã
ãããããã¾ã§è¡¨ç¤ºããã¾ããï¼'error'
ã¤ãã³ããã¡ããã¨æã¾ãããã¨ãã§ãã¦ãã¾ãï¼
ã¤ã»ã¾ã»ã
'error'
ã¤ãã³ããçºçããæï¼- ãªã¹ããããã°ãããå¼ã³åºãããï¼
- ãªã¹ãããªãã¨ããã»ã¹ã¯çµäºããï¼
ã¨ãããã¨ã§ãï¼'error'
以å¤ã®ã¤ãã³ãã§ã¯ï¼ãªã¹ããç¡ãã¦ãä½ãããã¾ããï¼ãããï¼EventEmitter
ã 'error'
ã¤ãã³ããç¹å¥ã«æ±ã£ã¦ããç¹ã§ãï¼
ãã¦ï¼'error'
ã¤ãã³ããçºçããæï¼ãªã¹ãããªãã¨ããã»ã¹ã¯çµäºããã¨æ¸ããã°ããã§ããï¼ããã¯ä¸æ£ç¢ºã§ãï¼å®éã«ä½ãèµ·ãããã¨ããã¨ï¼ä¾å¤ãã¹ãã¼ããã¾ãï¼ä¸ã®ã¹ã¿ãã¯ãã¬ã¼ã¹ã§ããError: Uncaught, unspecified 'error' event.
ãã¨è¡¨ç¤ºããã¦ãã¾ããï¼ããã¯ä¾å¤ (Error
ãªãã¸ã§ã¯ã) ã®ã¡ãã»ã¼ã¸ã§ãï¼
ä¾å¤ãªãæã¾ããã°ãããããªãï¼
var events = require('events'); var emitter = new events.EventEmitter(); try { emitter.emit('error'); } catch (err) { console.log('ããã', err); } console.log('ãã ãããã');
å®è¡ãã¾ãããï¼
$ node c.js ããã [Error: Uncaught, unspecified 'error' event.] ãã ãããã $
ã¡ããã¨æã¾ãããã¨ãã§ãã¾ããï¼
'error'
ã¤ãã³ããçºçãã¦ãï¼ãã®ãªã¹ããç¡ãã¦ãï¼ããã»ã¹ãçµäºãã¦ãã¾ãã¨ã¯éããªãã®ã§ãï¼
ã¤ã»ã¾ã»ã
'error'
ã¤ãã³ããçºçããæï¼- ãªã¹ããããã°ãããå¼ã³åºãããï¼
- ãªã¹ãããªãã¨ä¾å¤ãã¹ãã¼ãããï¼
- ä¾å¤ãã¹ãã¼ãããæï¼
- ãã£ãããããªãã¨ããã»ã¹ã¯çµäºããï¼
ã¨ãããã¨ã§ããï¼
ããã¡ãã£ã¨è©³ããæ¸ãã¨ï¼ä¾å¤ããã£ããããããã¨ãªãã¤ãã³ãã«ã¼ãã«å°éããã¨ï¼ããã»ã¹ã¯çµäºãã¡ããã¾ãï¼
ã¡ãªã¿ã«ï¼ã¹ãã¼ãããä¾å¤ã¯ 'error'
ã¤ãã³ããçæããéã«æå®ãããã¨ãã§ãã¾ãï¼emit(name, [args...])
ã®ç¬¬ 2 弿°ã« Error
ãªãã¸ã§ã¯ããæå®ããã¨ï¼ãããã¹ãã¼ããã¾ãï¼
var events = require('events'); var emitter = new events.EventEmitter(); try { emitter.emit('error', new Error('ã»ã')); } catch (err) { console.log('ããã', err); } console.log('ãã ãããã');
å®è¡ããã¨
$ node d.js ããã [Error: ã»ã] ãã ãããã $
ãã¦ãã¦ï¼ãä¾å¤ãã¹ãã¼ãããæï¼ãã£ãããããªãã¨ããã»ã¹ã¯çµäºãããã¨æ¸ããã°ããã§ããï¼ããã¯ä¸æ£ç¢ºã§ãï¼å®éã«ä½ãèµ·ãããã¨ããã¨ï¼process
ã¨ãããªãã¸ã§ã¯ãã§ 'uncaughtException'
ã¨ããã¤ãã³ããçæããã¾ãï¼
ã¤ãã³ããªãæã¾ããã°ãããããªãï¼
var events = require('events'); process.on('uncaughtException', function(err) { console.log('ããã', err); }); var emitter = new events.EventEmitter(); emitter.emit('error'); console.log('ãã ãããã');
å®è¡ããã¨
$ node e.js ããã [Error: Uncaught, unspecified 'error' event.] $
ã¹ã¿ãã¯ãã¬ã¼ã¹ãåºåãããªããªãã¾ããï¼ã§ãããã
ããããããåºã¦ãªãã®ã§ï¼ãã£ã±ãããã»ã¹ã¯çµäºãã¡ãã£ãããã«è¦ãã¾ããï¼emit('error')
ã§ä¾å¤ãã¹ãã¼ããã¦ããã®ã§ï¼ãã®å¾ã®ãã°åºåã¯å®è¡ããã¦ããªãã®ã§ããï¼ããã§ããã»ã¹ãçµäºããããã§ã¯ããã¾ããï¼'uncaughtException'
ã¤ãã³ãã®ãªã¹ããå®è¡ããã¦ï¼ä»ã«ãããã¨ããªãã®ã§çµäºããã ãã§ãï¼
ããã¡ãã£ã¨åããããããã¦ã¿ã¾ãããï¼
var events = require('events'); process.on('uncaughtException', function(err) { console.log('ããã', err); }); process.nextTick(function() { console.log('ãã ãããã'); }); var emitter = new events.EventEmitter(); emitter.emit('error');
å®è¡
$ node f.js ããã [Error: Uncaught, unspecified 'error' event.] ãã ãããã $
ä¾å¤ãã¹ãã¼ãã㦠'uncaughtException'
ãªã¹ããå¼ã³åºãããå¾ï¼ã¡ãã㨠process.nextTick()
ã§ç»é²ãã颿°ãå®è¡ããã¾ããï¼ããããµã¼ãã¢ããªã§ããã°ï¼ç£è¦ãã¦ããæ¥ç¶ãªã©ãããéãå®è¡ãç¶ç¶ãããã¨ã«ãªãã¾ãï¼
ãããªããã§ (ã©ããªããã§ï¼)ï¼'error'
ã¤ãã³ããçºçãã¦ãï¼ãã®ãªã¹ããç¡ãã¦ãï¼ä¾å¤ãã¹ãã¼ããã¦ãï¼ããããã£ãããããªãã¦ãï¼ããã»ã¹ãçµäºãã¦ãã¾ãã¨ã¯éããªãã®ã§ãï¼
ã¤ã»ã¾ã»ã
'error'
ã¤ãã³ããçºçããæï¼- ãªã¹ããããã°ãããå¼ã³åºãããï¼
- ãªã¹ãããªãã¨ä¾å¤ãã¹ãã¼ãããï¼
- ä¾å¤ãã¹ãã¼ãããæï¼
- ãã£ãããããªãã¨
process
ãªãã¸ã§ã¯ãã§'uncaughtException'
ã¤ãã³ããçºçããï¼
- ãã£ãããããªãã¨
process
ãªãã¸ã§ã¯ãã§'uncaughtException'
ã¤ãã³ããçºçããæï¼- ãªã¹ããããã°ãããå¼ã³åºãããï¼
- ãªã¹ãããªãã¨ä¾å¤ã®ã¹ã¿ãã¯ãã¬ã¼ã¹ãåºåãã¦ããã»ã¹ã¯çµäºããï¼
ã¨ãããã¨ã§ãï¼
å®éã®æï¼'error'
ã¤ãã³ãã«å¯¾ãããªã¹ããç¡ãã£ãå ´åï¼ä¾å¤ããã£ããããã®ã¯ç¾å®çã§ã¯ããã¾ããï¼'error'
ã¤ãã³ãã¯ä¸»ã«ãããã¯ã¼ã¯ããã¡ã¤ã«ã«å¯¾ãã I/O ãåå ã§çºçããããã§ï¼è¦ããã« 'error'
ã¤ãã³ãã çæ (emit()
) ããã®ã¯ Node æ¬ä½ï¼ããããã¢ããªã§ã¯ãã£ããã®ããããããã¾ããï¼
ãªã®ã§ï¼
'error'
ã¤ãã³ããçºçããæï¼- ãªã¹ãããªãã¨
process
ãªãã¸ã§ã¯ãã§'uncaughtException'
ã¤ãã³ããçºçããï¼
- ãªã¹ãããªãã¨
process
ãªãã¸ã§ã¯ãã§'uncaughtException'
ã¤ãã³ããçºçããæï¼- ãªã¹ãããªãã¨ä¾å¤ã®ã¹ã¿ãã¯ãã¬ã¼ã¹ãåºåãã¦ããã»ã¹ã¯çµäºããï¼
ã¨ç°¡ç´ åãã¦è¦ãã¦ããã¦ãåé¡ã¯ãªãã§ãããï¼
ãããªããã§ (ã©ããªããã§ï¼)ï¼ä½ããã®ã¨ã©ã¼ãçºçãã¦ãåä½ãç¶ããªããã°ãªããªããµã¼ãã¢ããªã±ã¼ã·ã§ã³ã®å ´åï¼'uncaughtException'
ã¤ãã³ãã®ãã³ããªã³ã°ã¯å¿
é ã§ãï¼ææªï¼
process.on('uncaughtException', console.debug);
ã®ä¸è¡ãå ¥ãã¦ããã ãã§ï¼ã¨ã©ã¼ãçºçãã¦ãããã»ã¹ã¯çµäºããªããªãã®ã§ï¼ã¡ãã£ã¨ãããã¢ã¢ããªã¨ãä½ãå ´åã¯ããã§ãå ¥ãã¦ããã¨ããã§ãããï¼ãããã¯ã·ã§ã³ã¬ãã«ã ã¨ãã¬ã¼ã ã¯ã¼ã¯çãªã¨ããã§ç»é²ãã¦ï¼ãã®ã³ã°ã¨ãã¡ããã¨ãããã¨ã«ãªãã§ããããï¼
ãã¦ï¼
'uncaughtException'
ã¤ãã³ãã®ãªã¹ããç»é²ããã°ï¼'error'
ã¤ãã³ããçºçãã¦ãããã»ã¹ã¯çµäºããªããªãããã§ããï¼è¨ã£ã¦ãã¾ãã°ããã ãã§ãï¼Web ã¢ããªãªããã ã¨ï¼ãªã¯ã¨ã¹ãã®å¦çä¸ã«ã¨ã©ã¼ãçºçããå ´åï¼ãããªãã®ç»é¢ãè¿ãã¨ããã¹ããã¨ã¯ããããããã¯ãã§ããï¼ãããããã«ã¯ 'uncaughtException'
ã¤ãã³ãã¯å¤§éæããã¾ãï¼ã¨ãªãã¨ï¼çµå±ã¯åã
ã® EventEmitter
ã« 'error'
ã¤ãã³ãã®ãªã¹ããç»é²ãã¦å¯¾å¦ããããããã¾ããï¼'uncaughtException'
ã¤ãã³ãã®ãªã¹ãã¯ï¼ä¸ãä¸åã
ã® EventEmitter
ã« 'error'
ã¤ãã³ãã®ãªã¹ããæ¼ãã¦ããå ´åã®ã¬ã¼ãã«éããªãã®ã§ããï¼
ç´°ç²åº¦ã® 'error'
ã¤ãã³ã (åã
ã® EventEmitter
) ã¨ç²ç²åº¦ã® 'uncaughtException'
ã¤ãã³ã (process
ãªãã¸ã§ã¯ã)ï¼
ããã¯ã¡ãã£ã¨ä¸¡æ¥µç«¯ã ããã¼ï¼ã¨ãããã¨ã§ Node v0.8 ã§å°å
¥ãããäºå®ãªã®ããDomainsãã§ãï¼ããã«ã¤ãã¦ã¯ææ¥ã®ãæ±äº¬ Node å¦å 3 æéç®ãã§ç°¡åã«ç´¹ä»ããäºå®ã§ãï¼ç°¡åã«ï¼ãï¼
ã¾ã¨ããã¨ï¼ã¨ã©ã¼ãçºçããã¨ããã«ã¯ã©ãã·ã¥ãããã Node ã¯æ®åãããããªãã¨ãè¨ã£ã¦ããã®ã¯å°å¦ 3 å¹´çã¾ã§ã ãããã£ããã¼ã¨ãããã¨ã§ããããã§ãï¼
ææ¥ã¯ nori0428 ããã§ãï¼