
HTTPãªã¯ãšã¹ããã¬ã¹ãã³ã¹ãã¹ããªãŒã ãªã©ã®ã»ãšãã©ã®Nodeãªããžã§ã¯ãã¯ã EventEmitter
ã¢ãžã¥ãŒã«ãå®è£
ããŸããããã«ãããã€ãã³ããçæããã³ãªãã¹ã³ã§ããŸãã
const EventEmitter = require('events')
ã€ãã³ã管çã®æãåçŽãªåœ¢åŒã¯ã fs.readFile
ãªã©ã®äžè¬çãªNode.jsé¢æ°ã®ã³ãŒã«ããã¯ã¹ã¿ã€ã«ã§ãã ãã®é¡æšã«ãããã€ãã³ãã¯1åçæããïŒNodeãã³ãŒã«ããã¯ãåŒã³åºãæºåãã§ãããšãïŒãã³ãŒã«ããã¯ã¯ã€ãã³ããã³ãã©ãŒãšããŠæ©èœããŸãã æåã«ãã€ãã³ãé§ååã¢ãŒããã¯ãã£ã®ãã®åºæ¬çãªåœ¢åŒãèŠãŠã¿ãŸãããã
æºåãã§ãããé»è©±ããŠãã ãããããŒãïŒ
ããŒãã¯æåã«ã³ãŒã«ããã¯ã䜿çšããŠéåæã€ãã³ããåŠçããŸããã ããã¯ããªãåã®ããšã§ãPromiseãšasync / awaitæ©èœã®ãã€ãã£ããµããŒããJavaScriptã«ç»å ŽããŸããã ã³ãŒã«ããã¯ã¯ãä»ã®é¢æ°ã«æž¡ãåãªãé¢æ°ã§ãã é¢æ°ã¯ãã¡ãŒã¹ãã¯ã©ã¹ã®ãªããžã§ã¯ãã§ãããããããã¯JavaScriptã§å¯èœã§ãã
ã³ãŒã«ããã¯ã¯ã³ãŒãå
ã®éåæåŒã³åºãã®ææšã§ã¯ãªãããšãç解ããããšãéèŠã§ãã é¢æ°ã¯ãã³ãŒã«ããã¯ãåæçããã³éåæçã«åŒã³åºãããšãã§ããŸãã ããšãã°ã fileSize
ãã¹ãé¢æ°ã¯cb
ã³ãŒã«ããã¯é¢æ°ãåãå
¥ããæ¡ä»¶ã«å¿ããŠåæçãŸãã¯éåæçã«åŒã³åºããŸãã
function fileSize (fileName, cb) { if (typeof fileName !== 'string') { return cb(new TypeError('argument should be string')); // Sync } fs.stat(fileName, (err, stats) => { if (err) { return cb(err); } // Async cb(null, stats.size); // Async }); }
ããã¯æªãã¢ãããŒãã§ãããäºæããªããšã©ãŒã«ã€ãªãããŸãã åžžã«åæçãŸãã¯åžžã«éåæçã«ã³ãŒã«ããã¯ãåãå
¥ãããã¹ãé¢æ°ãäœæããŸãã
ã³ãŒã«ããã¯ã¹ã¿ã€ã«ã§èšè¿°ãããå
žåçãªéåæNodeé¢æ°ã®ç°¡åãªäŸãèŠãŠã¿ãŸãããã
const readFileAsArray = function(file, cb) { fs.readFile(file, function(err, data) { if (err) { return cb(err); } const lines = data.toString().trim().split('\n'); cb(null, lines); }); };
readFileAsArray
ã¯ããã¡ã€ã«ãã¹ãšã³ãŒã«ããã¯é¢æ°ãåããŸãã ãã¡ã€ã«ã®å
容ãèªã¿åããæååã®é
åã«åå²ãããã®é
åã®ã³ãŒã«ããã¯é¢æ°ãåŒã³åºããŸãã 䜿çšæ¹æ³ã¯æ¬¡ã®ãšããã§ãã numbers.txt
ãã¡ã€ã«ããã®ã³ã³ãã³ããšåããã£ã¬ã¯ããªã«ãããšããŸãã
10 11 12 13 14 15
ãã®ãã¡ã€ã«å
ã®æ°å€ãã«ãŠã³ãããã¿ã¹ã¯ãããå Žåãã³ãŒããç°¡çŽ åããããã«readFileAsArray
ã䜿çšã§ããŸãã
readFileAsArray('./numbers.txt', (err, lines) => { if (err) throw err; const numbers = lines.map(Number); const oddNumbers = numbers.filter(n => n%2 === 1); console.log('Odd numbers count:', oddNumbers.length); });
ãã®ã³ãŒãã¯ãæååã®é
åå
ã®æ°å€ã³ã³ãã³ããèªã¿åããæ°å€ãšããŠè§£æããã«ãŠã³ããå®è¡ããŸãã
ããã§ã¯ããŒãã®ã³ãŒã«ããã¯ã¹ã¿ã€ã«ãæ©èœããŸãã ã³ãŒã«ããã¯ã«ã¯err
error-firståŒæ°ããããŸãããããã¯nullã®å ŽåããããŸãã ãã®ã³ãŒã«ããã¯ããã¹ãé¢æ°ã®æåŸã®åŒæ°ãšããŠæž¡ããŸãã ãŠãŒã¶ãŒã¯ã»ãšãã©ã®å Žåãããä¿¡é Œãããããé¢æ°ã§ã¯åžžã«ããããŸãã ãã¹ãé¢æ°ãæåŸã®åŒæ°ãšããŠã³ãŒã«ããã¯ãåãåããã³ãŒã«ããã¯ãæåã®åŒæ°ãšããŠãšã©ãŒãªããžã§ã¯ããåãåãããã«ããŸãã
ã³ãŒã«ããã¯ã«ä»£ããææ°ã®JS
ææ°ã®JavaScriptã«ã¯promiseãªã©ã®ãªããžã§ã¯ãããããŸãã éåæAPIã®å Žåãã³ãŒã«ããã¯ã®ä»£ããã«äœ¿çšã§ããŸãã ã³ãŒã«ããã¯ãåŒæ°ãšããŠæž¡ããŠåãå Žæã§ãšã©ãŒãåŠçãã代ããã«ãpromiseã¯æåãšãšã©ãŒã®ç¶æ³ãå¥ã
ã«åŠçããããã€ãã®éåæåŒã³åºãããã¹ãããã®ã§ã¯ãªãããã§ãŒã³ã«æ¥ç¶ã§ããŸãã
readFileAsArray
é¢æ°ããããã¹ããµããŒãããå Žåã次ã®ããã«äœ¿çšã§ããŸãã
readFileAsArray('./numbers.txt') .then(lines => { const numbers = lines.map(Number); const oddNumbers = numbers.filter(n => n%2 === 1); console.log('Odd numbers count:', oddNumbers.length); }) .catch(console.error);
ã³ãŒã«ããã¯ãæž¡ã代ããã«ããã¹ãé¢æ°ã®æ»ãå€ã«é¢é£ããŠ.then
é¢æ°ãåŒã³åºããŸãã éåžžã .then
ã¯ãã³ãŒã«ããã¯ããŒãžã§ã³ã§ååŸããã®ãšåãé
åè¡ã«ã¢ã¯ã»ã¹ã§ããããã以åãšåãããã«äœæ¥ã§ããŸãã ãšã©ãŒãåŠçããã«ã¯ãçµæã«.catch
åŒã³åºããè¿œå ããŸããããã«ããããšã©ãŒãçºçããå Žåã«ãšã©ãŒã«ã¢ã¯ã»ã¹ã§ããŸãã
ææ°ã®JavaScriptã®æ°ããPromiseãªããžã§ã¯ãã®ãããã§ããã¹ãé¢æ°ã䜿çšããPromiseã€ã³ã¿ãŒãã§ãŒã¹ãµããŒãã®å®è£
ã容æã«ãªããŸããã æ¢ã«ãµããŒããããŠããã³ãŒã«ããã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«å ããŠãPromiseã€ã³ã¿ãŒãã§ã€ã¹ããµããŒãããããã«å€æŽãããreadFileAsArray
é¢æ°ã¯æ¬¡ã®readFileAsArray
ã§ãã
const readFileAsArray = function(file, cb = () => {}) { return new Promise((resolve, reject) => { fs.readFile(file, function(err, data) { if (err) { reject(err); return cb(err); } const lines = data.toString().trim().split('\n'); resolve(lines); cb(null, lines); }); }); };
ãã®é¢æ°ã¯ãéåæfs.readFile
åŒã³åºããfs.readFile
ãPromiseãªããžã§ã¯ããè¿ããŸãã promiseã«ã¯ã resolve
é¢æ°ãšreject
é¢æ°ã®2ã€ã®åŒæ°ããããŸãã ãšã©ãŒã§ã³ãŒã«ããã¯ãåŒã³åºãå¿
èŠãããå Žåã¯ããããã¹ãreject
é¢æ°ã䜿çšããããŒã¿ãå«ãã³ãŒã«ããã¯ã§ã¯ãããã¹ãresolve
ããé¢æ°ã䜿çšããŸãã
å¯äžã®éãã¯ãpromiseã€ã³ã¿ãŒãã§ã€ã¹ã§ã³ãŒãã䜿çšãããå Žåã«åããŠãã³ãŒã«ããã¯åŒæ°ã®ããã©ã«ãå€ãå¿
èŠãªããšã§ãã ããšãã°ãåçŽãªããã©ã«ãã®ç©ºã®é¢æ°() => {}
ãåŒæ°ãšããŠäœ¿çšã§ããŸãã
async / awaitã䜿çšããŠPromiseãé©çšãã
promiseã€ã³ã¿ãŒãã§ãŒã¹ãè¿œå ãããšãã«ãŒãå
ã§éåæé¢æ°ã䜿çšããå¿
èŠãããå Žåã«ã³ãŒããæäœãããããªããŸãã ã³ãŒã«ããã¯ã§ã¯ãç¶æ³ã¯ããè€éã§ãã é¢æ°ãžã§ãã¬ãŒã¿ãŒãšåæ§ã«ãçŽæã¯ç©äºãå°ãæ¹åããŸãã ã€ãŸããéåæã³ãŒããæäœããããã®ããæè¿ã®ä»£æ¿æ段ã¯ã async
é¢æ°ã§ãã éåæã³ãŒããåæãšããŠæ±ãããšãã§ãããããã³ãŒãã®å¯èªæ§ã倧å¹
ã«åäžããŸãã
readFileAsArray
é¢æ°ãasync / awaitã§äœ¿çšããæ¹æ³ã¯readFileAsArray
ã§ãã
async function countOdd () { try { const lines = await readFileAsArray('./numbers'); const numbers = lines.map(Number); const oddCount = numbers.filter(n => n%2 === 1).length; console.log('Odd numbers count:', oddCount); } catch(err) { console.error(err); } } countOdd();
æåã«ãéåæé¢æ°ãäœæããŸã-æåã«async
ãšããåèªãå«ãéåžžã®é¢æ°ã§ãã ãã®äžã§ã readFileAsArray
é¢æ°ãåŒã³åºããŠãè¡å€æ°ãè¿ããã®ããã«ããã®ããã«await
ããŒã¯ãŒãã䜿çšããŸãã readFileAsArray
åŒã³åºããåæã§ãã£ãå Žåãã³ãŒããç¶è¡ããŸãã ãããéæããããã«ãéåæé¢æ°ãå®è¡ããŸãã ã ãããã·ã³ãã«ã§èªã¿ãããããšãããããŸããã ãšã©ãŒã«å¯ŸåŠããã«ã¯ãéåæåŒã³åºããtry/catch
åŒã§ã©ããããå¿
èŠããããŸãã
éåæ/åŸ
æ©æ©èœã®ãããã§ãç¹å¥ãªAPIïŒ.thenã.catchãªã©ïŒã¯å¿
èŠãããŸããã§ããã é¢æ°ã«ç°ãªãã©ãã«ãä»ããŠãçŽç²ãªJavaScriptã䜿çšããŸããã
promiseã€ã³ã¿ãŒãã§ãŒã¹ããµããŒãããä»»æã®é¢æ°ã§async / awaitã䜿çšã§ããŸãã ãã ããéåæã³ãŒã«ããã¯ã¹ã¿ã€ã«ã®é¢æ°ïŒsetTimeoutãªã©ïŒã䜿çšããããšã¯ã§ããŸããã
EventEmitterã¢ãžã¥ãŒã«
EventEmitterã¯ãNodeå
ã®ãªããžã§ã¯ãéã®éä¿¡ã容æã«ããã¢ãžã¥ãŒã«ã§ãã ããã¯ãéåæã€ãã³ãé§ååã¢ãŒããã¯ãã£ã®äžæ žã§ãã Nodeã«çµã¿èŸŒãŸããŠããã¢ãžã¥ãŒã«ã®å€ãã¯ãEventEmitterãç¶æ¿ããŠããŸãã
圌ã®ã¢ã€ãã¢ã¯ã·ã³ãã«ã§ãããšããã¿ãŒãªããžã§ã¯ãã¯ã以åã«ç»é²ããããªã¹ããŒãåŒã³åºãååä»ãã€ãã³ããçæããŸãã ãã®ããããšããã¿ã«ã¯2ã€ã®äž»ãªæ©èœããããŸãã
- ååä»ãã€ãã³ãã®çæã
- ãªã¹ããŒé¢æ°ã®ç»é²ãšç»é²è§£é€ã
EventEmitterã䜿çšããã«ã¯ãæ¡åŒµæ©èœã¯ã©ã¹ãäœæããå¿
èŠããããŸãã
class MyEmitter extends EventEmitter { }
ãšããã¿ãŒã¯ãEventEmitterã«åºã¥ãã¯ã©ã¹ããã€ã³ã¹ã¿ã³ã¹åãããã®ã§ãã
const myEmitter = new MyEmitter();
ãšããã¿ãŒã®ã©ã€ããµã€ã¯ã«ã®ã©ã®æç¹ã§ããemité¢æ°ã䜿çšããŠååä»ãã€ãã³ããçæã§ããŸãã
myEmitter.emit('something-happened');
ã€ãã³ãçæã¯ãäœããã®æ¡ä»¶ãæºããããããšã瀺ãã·ã°ãã«ã§ãã éåžžãçæãªããžã§ã¯ãã®ç¶æ
ãå€æŽããããšã«ã€ããŠè©±ããŸãã on
ã¡ãœããã䜿çšããon
ããšããã¿ãŒãé¢é£ä»ããããååä»ãã€ãã³ããçæãããã³ã«å®è¡ããããªã¹ããŒé¢æ°ãè¿œå ã§ããŸãã
ã€ãã³ãïŒ==éåæ
äŸãèŠãŠã¿ãŸãããïŒ
const EventEmitter = require('events'); class WithLog extends EventEmitter { execute(taskFunc) { console.log('Before executing'); this.emit('begin'); taskFunc(); this.emit('end'); console.log('After executing'); } } const withLog = new WithLog(); withLog.on('begin', () => console.log('About to execute')); withLog.on('end', () => console.log('Done with execute')); withLog.execute(() => console.log('*** Executing task ***'));
WithLog
ã¯ã©ã¹ã¯ãšããã¿ãŒã§ãã execute
é¢æ°ã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãå®çŸ©ããŸãã ã¿ã¹ã¯é¢æ°ãšãã1ã€ã®åŒæ°ãåãåãããã®å®è¡ããã°åŒã§ã©ããããŸãã ã€ãã³ãã¯å®è¡ã®ååŸã«çæãããŸãã
ãã¹ãŠãæ©èœããé åºã確èªããã«ã¯ãååä»ãã€ãã³ãã®ãªã¹ããŒãç»é²ãããµã³ãã«ã¿ã¹ã¯ãå®è¡ããŠãã§ãŒã³å
šäœãå®è¡ããŸãã
çµæïŒ
Before executing About to execute *** Executing task *** Done with execute After executing
ã³ãŒãå®è¡ã®çµæã«é¢ããŠæ³šæãããããšïŒéåæã¯ãããŸããã
- ãŸãããå®è¡åããšããè¡ãååŸããŸãã
- 次ã«ãååä»ãã®
begin
ã€ãã³ãã®çµæãæååãAbout to executeããçæãããŸãã - 次ã«ãå®éã«å®è¡å¯èœãªè¡ã¯ã
«*** Executing task ***»
ãšããè¡ãçæã«*** Executing task ***»
ã - 次ã«ãååä»ã
end
ã€ãã³ãã®çµæãæååãDone with executeããçæãããŸãã - æåŸã«ããå®è¡åŸããšããè¡ã衚瀺ãããŸãã
å€ãè¯ãã³ãŒã«ããã¯ãšåæ§ã«ãã€ãã³ããåæã³ãŒããŸãã¯éåæã³ãŒãã®ç¹æ§ã§ããããšã瀺åããŠããŸããã execute
ã«éåætaskFuncãæž¡ããšãçæãããã€ãã³ããæ£ç¢ºã§ãªããªããããããã¯éèŠã§ãã
setImmediate
ãåŒã³åºãããšã«ããããã®ç¶æ³ããšãã¥ã¬ãŒãã§ããŸãã
// ... withLog.execute(() => { setImmediate(() => { console.log('*** Executing task ***') }); });
çµæã¯æ¬¡ã®ããã«ãªããŸãã
Before executing About to execute Done with execute After executing *** Executing task ***
ããã¯ééã£ãŠããŸãã éåæåŒã³åºãã®åŸã®è¡ã¯ããå®è¡æžã¿ãããã³ãå®è¡åŸããšããåŒã³åºãã®åºçŸã«ã€ãªãããééã£ãé åºã§è¡šç€ºãããŸãã
éåæé¢æ°ã®å®äºåŸã«ã€ãã³ããçæããã«ã¯ãã³ãŒã«ããã¯ïŒãŸãã¯ãããã¹ïŒããã®ã€ãã³ãé§ååã®éä¿¡ãšçµã¿åãããå¿
èŠããããŸãã ããã以äžã®äŸã§ç€ºããŸãã
éåžžã®ã³ãŒã«ããã¯ã®ä»£ããã«ã€ãã³ãã䜿çšããå©ç¹ã®1ã€ã¯ãè€æ°ã®ãªã¹ããŒã®å®çŸ©ã®ãããã§ãåãä¿¡å·ã«äœåºŠãå¿çã§ããããšã§ãã ã³ãŒã«ããã¯ã§åãããšãè¡ãã«ã¯ãå©çšå¯èœãª1ã€ã®ã³ãŒã«ããã¯å
ã«ããå€ãã®ããžãã¯ãèšè¿°ããå¿
èŠããããŸãã ã€ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ã«æ©èœãè¿œå ããå€æ°ã®å€éšãã©ã°ã€ã³ãå®è£
ããçŽ æŽãããæ¹æ³ã§ãã ç¶æ
ãå€æŽãããšãã®åäœãã«ã¹ã¿ãã€ãºããããã®ãã³ãã¯ã¿ããšèŠãªãããšãã§ããŸãã
éåæã€ãã³ã
åæã®äŸããéåæã§ããå°ã䟿å©ãªãã®ã«å€æããŸãããã
const fs = require('fs'); const EventEmitter = require('events'); class WithTime extends EventEmitter { execute(asyncFunc, ...args) { this.emit('begin'); console.time('execute'); asyncFunc(...args, (err, data) => { if (err) { return this.emit('error', err); } this.emit('data', data); console.timeEnd('execute'); this.emit('end'); }); } } const withTime = new WithTime(); withTime.on('begin', () => console.log('About to execute')); withTime.on('end', () => console.log('Done with execute')); withTime.execute(fs.readFile, __filename);
WithTime
ã¯ã©ã¹ã¯asyncFunc
ãå®è¡ãã console.time
ããã³console.timeEnd
åŒã³åºãã䜿çšããŠããã®asyncFunc
è²»ãããæéãå ±åããŸãã å®è¡ååŸã«ã€ãã³ãã®æ£ããã·ãŒã±ã³ã¹ãçæããŸãã ãŸããéåžžã®éåæåŒã³åºãä¿¡å·ã§åäœãããšã©ãŒ/ããŒã¿ã€ãã³ããçæããŸãã
éåæé¢æ°fs.readFile
åŒã³åºããæž¡ãããšã«ããwithTime
ãšããã¿withTime
ãŸãã ã³ãŒã«ããã¯ã䜿çšããŠãã¡ã€ã«ã®ããŒã¿ãåŠçãã代ããã«ãããŒã¿ã€ãã³ãããªãã¹ã³ã§ããããã«ãªããŸããã
ãã®ã³ãŒããå®è¡ãããšãäºæ³ã©ãããæ£ããã€ãã³ãã·ãŒã±ã³ã¹ãšå®è¡æéã«é¢ããã¬ããŒããååŸãããŸãã
About to execute execute: 4.507ms Done with execute
ãã®ãããã³ãŒã«ããã¯ãšãšããã¿ãŒãçµã¿åãããå¿
èŠãããããšã«æ³šæããŠãã ããã asynFunc
ããµããŒãããŠããå Žåãasync / awaitã䜿çšããŠåããã¹ãŠãå®è£
ã§ããŸãã
class WithTime extends EventEmitter { async execute(asyncFunc, ...args) { this.emit('begin'); try { console.time('execute'); const data = await asyncFunc(...args); this.emit('data', data); console.timeEnd('execute'); this.emit('end'); } catch(err) { this.emit('error', err); } } }
ããªãã«ãšã£ãŠã©ã®ããã«ããããããããããŸããããç§ã«ãšã£ãŠã¯ãã³ãŒã«ããã¯ãŸãã¯.then / .catchã䜿çšããè¡ã«åºã¥ãã³ãŒããããã¯ããã«èªã¿ããããªã£ãŠããŸãã async / awaitæ©èœã«ãããã§ããéãJavaScriptã«è¿ã¥ããããšãã§ããããã¯çŽ æŽãããææã ãšæããŸãã
ã€ãã³ããšãšã©ãŒã®åŒæ°
åã®äŸã§ã¯ãè¿œå ã®åŒæ°ã䜿çšããŠ2ã€ã®ã€ãã³ããçæãããŸããã ãšã©ãŒã€ãã³ãã¯ããšã©ãŒãªããžã§ã¯ãã«ãã£ãŠçæãããŸããã
this.emit('error', err);
ããŒã¿ã€ãã³ãã¯ãããŒã¿ãªããžã§ã¯ãã«ãã£ãŠçæãããŸãã
this.emit('data', data);
ååä»ãã€ãã³ãã®åŸãå¿
èŠãªæ°ã®åŒæ°ã䜿çšã§ããŸãããã¹ãŠã®åŒæ°ã¯ããããã®ååä»ãã€ãã³ãçšã«ç»é²ãããªã¹ããŒé¢æ°å
ã§äœ¿çšã§ããŸãã
ããšãã°ãããŒã¿ã€ãã³ããæäœããã«ã¯ãç»é²ããããªã¹ããŒé¢æ°ããçæãããã€ãã³ãã«æž¡ãããããŒã¿åŒæ°ã«ã¢ã¯ã»ã¹ããŸãã ãããŠããã®ããŒã¿ãªããžã§ã¯ãã¯asyncFunc
æäŸãããã®ãšãŸã£ããåãã§ãã
withTime.on('data', (data) => { // do something with data });
éåžžã error
ã€ãã³ãã¯ç¹å¥ã§ãã ã³ãŒã«ããã¯ã®ããäŸ-ãªã¹ããŒã䜿çšããŠãšã©ãŒã€ãã³ããåŠçããªãå ŽåãNodeããã»ã¹ã¯çµäºããŸãã
ãã®åäœãå®èšŒããã«ã¯ãäžæ£ãªåŒæ°ãæå®ããŠã¡ãœããå®è¡ãå床åŒã³åºããŸãã
class WithTime extends EventEmitter { execute(asyncFunc, ...args) { console.time('execute'); asyncFunc(...args, (err, data) => { if (err) { return this.emit('error', err);
æåã®å®è¡åŒã³åºãã¯ãšã©ãŒã«ãªããŸãã ããŒãããã»ã¹ãã¯ã©ãã·ã¥ãŸãã¯çµäºããŸãã
events.js:163 throw er; // Unhandled 'error' event ^ Error: ENOENT: no such file or directory, open ''
ãã®ããããã¯ã2çªç®ã®å®è¡åŒã³åºãã«åœ±é¿ããŸããããŸã£ããå®è¡ãããªãå ŽåããããŸãã
ç¹å¥ãªerror
ã€ãã³ãã®ãªã¹ããŒãç»é²ãããšãNodeããã»ã¹ã®åäœãå€ãããŸãã äŸïŒ
withTime.on('error', (err) => { // do something with err, for example log it somewhere console.log(err) });
ãã®å Žåãæåã®å®è¡åŒã³åºãã®ãšã©ãŒãå ±åãããŸãããNodeããã»ã¹ã¯ã¯ã©ãã·ã¥ãããçµäºããŸããã 2çªç®ã®å®è¡åŒã³åºãã¯æ£åžžã«çµäºããŸãã
{ Error: ENOENT: no such file or directory, open '' errno: -2, code: 'ENOENT', syscall: 'open', path: '' } execute: 4.276ms
Nodeã¯promiseã«åºã¥ããé¢æ°ã§ã¯ç°ãªãåäœãããããã«ãªããŸãããèŠåã®ã¿ã衚瀺ããŸãããæçµçã«ã¯å€æŽãããããšã«æ³šæããŠãã ããã
UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: ENOENT: no such file or directory, open '' DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
çæããããšã©ãŒã«ããäŸå€ãåŠçããå¥ã®æ¹æ³ã¯ã uncaughtException
ããã»ã¹ã®ã°ããŒãã«ã€ãã³ãuncaughtException
ãç»é²ããããšã§ãã ãã ãããã®ãããªã€ãã³ãã§ã°ããŒãã«ã«ãšã©ãŒããã£ããããããšã¯ãå§ãã§ããŸããã
uncaughtException
æšæºçãªãã³ãïŒäœ¿çšãuncaughtException
ãã ããã ãã ããå¿
èŠãªå ŽåïŒããšãã°ãäœãèµ·ãã£ãã®ããå ±åããããã¯ãªãŒã³ã¢ãããããããå ŽåïŒããšã«ããããã»ã¹ãçµäºãããŸãã
process.on('uncaughtException', (err) => { // something went unhandled. // Do any cleanup and exit anyway! console.error(err); // don't do just that. // FORCE exit the process too. process.exit(1); });
ãã ããããã€ãã®ãšã©ãŒã€ãã³ããåæã«çºçãããšããŸãã ããã¯ã uncaughtException
ãªã¹ããŒãæ°åuncaughtException
ããšãæå³ããã³ãŒããã¯ãªã¢ãããšãã«åé¡ã«ãªãå¯èœæ§ããããŸãã ããã¯ãããšãã°ãè€æ°ã®åŒã³åºãã«ãã£ãŠããŒã¿ããŒã¹ãã·ã£ããããŠã³ãããå Žåã«çºçããŸãã
EventEmitter
ã¢ãžã¥ãŒã«ã¯ã once
ã¡ãœãããæäŸããŸãã ãªã¹ããŒã®1åã®åŒã³åºãã§ååã§ããããšãéç¥ããŸãã uncaughtException
ãæå®ããŠã¡ãœããã䜿çšããã®ãå®çšçã§ããæåã®ãã£ãããããªãã£ãäŸå€ã§ã¯ããããã«ããŠãããã»ã¹ãçµäºããããšãèªèããŠãã¯ãªãŒã³ã¢ãããéå§ããããã§ãã
ãªã¹ããŒã®é åº
1ã€ã®ã€ãã³ããè€æ°ã®ãªã¹ããŒãç»é²ããå Žåããããã¯äœããã®é åºã§åŒã³åºãããŸãã æåã«ç»é²ããããã®ãæåã«åŒã³åºãããŸãã
// à€ªà¥à€°à€¥à€® withTime.on('data', (data) => { console.log(`Length: ${data.length}`); }); // à€Šà¥à€žà€°à€Ÿ withTime.on('data', (data) => { console.log(`Characters: ${data.toString().length}`); }); withTime.execute(fs.readFile, __filename);
ãã®ã³ãŒããå®è¡ãããšãæåã«ãLengthããšããè¡ããã°ã«å
¥åããã次ã«ãCharactersããå
¥åãããŸããããã¯ããã®é åºã§ãªã¹ããŒã決å®ããããã§ãã
æ°ãããªã¹ããŒãå®çŸ©ããå¿
èŠãããããæåã«prependListener
å¿
èŠãããå Žåã¯ã prependListener
ã¡ãœããã䜿çšã§ããŸãã
// à€ªà¥à€°à€¥à€® withTime.on('data', (data) => { console.log(`Length: ${data.length}`); }); // à€Šà¥à€žà€°à€Ÿ withTime.prependListener('data', (data) => { console.log(`Characters: ${data.toString().length}`); }); withTime.execute(fs.readFile, __filename);
ãã®å ŽåããCharactersããšããè¡ããã°ã®æåã«è¡šç€ºãããŸãã
æåŸã«ããªã¹ããŒãåé€ããå¿
èŠãããå Žåã¯ã removeListener
ã¡ãœããã䜿çšããŸãã
ããã ãã§ã