Nodeãããªãããç¥ã£ãŠãããšæããŸãã éå»3幎éãç§ãåãçµãã§ãããµã€ãã®1ã€ã§ã¯ããããªãã§ã¯ã§ããŸããã§ããã ããããç§ã¯ãŸã ããã¥ã¡ã³ããé©åã«èªãã§ããŸããã
ã€ã³ã¿ãŒãã§ã€ã¹ãããããã£ãã¡ãœãããé¢æ°ãããŒã¿åãããã³Webéçºã«é¢é£ããä»ã®ãã¹ãŠã«é¢ããæçšãªããšãæžãçãããã§ãã ã ããç§ã¯ç¥èã®ã®ã£ãããåããŸãã çŸåšãNode.jsã®ããã¥ã¡ã³ãã§å¿ããããã以åã¯HTMLãDOMãWeb APIãCSSãSVGãããã³EcmaScriptã®è³æã«åãçµãã§ããŸããã
Node.jsã®ããã¥ã¡ã³ããèªããšãä»ãŸã§ç¥ããªãã£ãå€ãã®çŽ æŽãããããšãããããŸããã ãã®çãèšäºã§ããããå
±æããããšæããŸãã æãèå³æ·±ããã®ããå§ããŸãã æ°ããå人ã«ç§ã®ã¬ãžã§ãããèŠãããšããç§ã¯éåžžåãããšãããŸãã
1.ãŠãããŒãµã«ããŒãµãŒãšããŠã®ã¯ãšãªæååã¢ãžã¥ãŒã«
次ã®ãããªããŒ/å€ã®ãã¢ã®é
åãçæããããã€ãã®é¢šå€ãããªããŒã¿ããŒã¹ããããŒã¿ãååŸãããšããŸãããïŒ
name:Sophie;shape:fox;condition:new
ã ãããJavaScriptãªããžã§ã¯ãã«ç°¡åã«å€æã§ãããšä¿¡ããã®ã¯åœç¶ã§ãã ãããã£ãŠã空ã®ãªããžã§ã¯ããäœæãã次ã«é
åãäœæããŠãæååãã
;
ãã§åå²ããŸã
;
ãã 次ã«-ãã®é
åã®åèŠçŽ ã埪ç°ããã
:
ãèšå·ã§è¡ãå床åå²ããŸãã ãã®çµæãåè¡ããååŸãããæåã®èŠçŽ ã¯æ°ãããªããžã§ã¯ãã®ããããã£åã«ãªãã2çªç®ã®èŠçŽ ã¯å€ã«ãªããŸãã
ãã¹ãŠãæ£ããã§ããïŒ
ããããæ£ãããããŸããã åæ§ã®ç¶æ³ã§ã¯ã
querystring
ã䜿çšããã ãã§ååã§ãã
const weirdoString = `name:Sophie;shape:fox;condition:new`; const result = querystring.parse(weirdoString, `;`, `:`); // : // { // name: `Sophie`, // shape: `fox`, // condition: `new`, // };
2.ãããã°ïŒV8ã€ã³ã¹ãã¯ã¿ãŒ
--inspect
ããŠNodeãå®è¡ãããšãURLãå ±åãããŸãã Chromeã§ãã®ã¢ãã¬ã¹ã«ç§»åããŸãã ãããŠä»-楜ããé©ãã Chromeéçºè
ããŒã«ã䜿çšããŠ
Node.jsã
ãããã°ã§ããŸãã 幞ããªæ代ãæ¥ãŸããã Paul Irishã®ãã®ãããã¯ã«é¢ãã
ã¬ã€ãã次ã«ç€ºããŸãã
ãã®æ©èœã¯ãŸã å®éšçãªãã®ã§ãããç§ã¯åãã§äœ¿çšããŠããŸããããããŸã§ã®ãšããç§ã¯å€±æããŠããŸããã
3. nextTickãšsetImmediateã®éã
ä»ã®å€ãã®ãœãããŠã§ã¢ã¡ã«ããºã ãšåæ§ã«ããããã®2ã€ã®é¢æ°ã®éããèŠããã®ã¯ãããæå³ã®ããååãä»ãããšéåžžã«ç°¡åã§ãã
ãããã£ãŠãé¢æ°
process.nextTick()
ã¯
process.nextTick()
ãšåŒã°ããã¹ãã§ãã
setImmediate()
ã¯
sendThisToTheEndOfTheQueue()
ã§ãã
ã¡ãªã¿ã«ãNode v0.10.0以éã®
nextTick
æé©åã«é¢ããæçšãªè³æããããŸãã å°ãäœè«ã Reactã®
props
ã¯
stuffThatShouldStayTheSameIfTheUserRefreshes
ãåŒã³åºãã
state
stuffThatShouldStayTheSameIfTheUserRefreshes
ãåŒã³åºãã¹ãã ãšãã€ãæã£ãŠã
stuffThatShouldBeForgottenIfTheUserRefreshes
ã ãããã®ååã®é·ããåãã§ãããšããäºå®ã¯ãå¶ç¶ã®äžèŽãšèããŠãã ããã
4. Server.listenã¯ãã©ã¡ãŒã¿ãŒãæã€ãªããžã§ã¯ããåãå
¥ããŸã
ç§ã¯ãããšãã°ãããªãã·ã§ã³ããšããååã®ãªããžã§ã¯ãã®åœ¢åŒã§ãã©ã¡ãŒã¿ãŒãæž¡ãããšãæ¯æããŠããŸããé¢æ°ãžã®å
¥åã§å€ãã®ãã©ã¡ãŒã¿ãŒãäºæ³ãããå Žåã®ã¢ãããŒãã§ã¯ãªããããã«ååããªããå³å¯ã«å®çŸ©ãããé åºã§é
眮ããå¿
èŠããããŸã å€æããããã«ããµãŒããŒã
èŠæ±ã
ãªãã¹ã³ããããã«æ§æãããšããã©ã¡ãŒã¿ãŒãæã€ãªããžã§ã¯ãã䜿çšã§ããŸãã
require(`http`) .createServer() .listen({ port: 8080, host: `localhost`, }) .on(`request`, (req, res) => { res.end(`Hello World!`); });
ãã®äŸ¿å©ãªæ©èœã¯ããªãããé ããŠããŸããã
http.Server
ããã¥ã¡ã³ãã§ãããã«ã€ããŠã®èšèã§ã¯ãããŸããã ãã ããããã¯
net.Server
ã®èª¬æã«
net.Server
ããã®ç¶æ¿è
ã¯
http.Server
ã§ãã
5.çžå¯Ÿãã¡ã€ã«ãã¹
fs
ã¢ãžã¥ãŒã«ã«æž¡ããããã¡ã€ã«ã·ã¹ãã ã®ãã¹ã¯çžå¯Ÿãã¹ã§ãã åç
§ãã€ã³ãã¯ã
process.cwd()
ã«ãã£ãŠè¿ãããçŸåšã®äœæ¥ãã£ã¬ã¯ããªã§ãã ããããã誰ãããã§ã«ãããç¥ã£ãŠããŸãããç§ã¯åžžã«ãã«ãã¹ãªãã§ã¯ã§ããªããšæã£ãŠããŸããã
const fs = require(`fs`); const path = require(`path`); // ... fs.readFile(path.join(__dirname, `myFile.txt`), (err, data) => { // - }); // ? fs.readFile(`./path/to/myFile.txt`, (err, data) => { // - });
6.ãã¡ã€ã«ãã¹ã®è§£æ
éåžžããã¡ã€ã«ãã¹ããååãšæ¡åŒµåãååŸããå¿
èŠããããšãã¯ãæ£èŠè¡šçŸã䜿çšããŸããã ä»ãç§ã¯ããã絶察ã«å¿
èŠãªãããšãç解ããŠããŸãã åãããšã¯
æšæºã®æ段ã§ã§ããŸãã
myFilePath = `/someDir/someFile.json`; path.parse(myFilePath).base === `someFile.json`; // true path.parse(myFilePath).name === `someFile`; // true path.parse(myFilePath).ext === `.json`; // true
7.ã³ã³ãœãŒã«ã§ã®ãã°ã®è²ä»ã
console.dir(obj, {colors: true})
ã³ã³ã¹ãã©ã¯ãã䜿çš
ãããšãããããã£ãšå€
ãã³ã³ãœãŒã«ã§è²ä»ã
ã§åŒ·èª¿
衚瀺ããããªããžã§ã¯ãã
衚瀺ã§ãã
ããšãç¥ããªãã£ããµããããŸãã ããã«ããããã°ã®èªã¿åãã容æã«ãªããŸãã
8.管çsetIntervalïŒïŒ
ããšãã°ã
setInterval()
ã䜿çšããŠãããŒã¿ããŒã¹ã1æ¥ã«1åã¯ãªãŒãã³ã°ããŸãã ããã©ã«ãã§ã¯ã
setInterval()
ã䜿çšããŠå®è¡ãããããã«ã¹ã±ãžã¥ãŒã«ãããã³ãŒãããããŸã§ãNodeã€ãã³ãã«ãŒãã¯åæ¢ããŸããã Nodeã«äŒæ©ãäžãããå ŽåïŒããããã©ã®ãããªå©ç¹ãåŸããããããããŸããïŒã
unref()
é¢æ°ã䜿çšããŸãã
const dailyCleanup = setInterval(() => { cleanup(); }, 1000 * 60 * 60 * 24); dailyCleanup.unref();
ãã ããããã§ã¯æ³šæãå¿
èŠã§ãã NodeãããžãŒã§ãªããªã£ãå ŽåïŒããšãã°ãæ¥ç¶ãåŸ
æ©ããŠããHTTPãµãŒããŒããªãå ŽåïŒãã·ã£ããããŠã³ããŸãã
9.ããã»ã¹ã®ã·ã°ãã«å®äºã®å®æ°
殺ããããªãããããããã§ã«ãããããŠããã§ãããïŒ
process.kill(process.pid, `SIGTERM`);
ãã®ãã¶ã€ã³ã«ã€ããŠæªãããšã¯äœãèšããŸããã ããããã¿ã€ããã¹ã«ãããã¹ãããŒã ã«äŸµå
¥ããå Žåã¯ã©ãã§ããããïŒ ããã°ã©ãã³ã°ã®æŽå²ã«ãããŠããã®ãããªã±ãŒã¹ã¯ç¥ãããŠããŸãã ããã®2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯æååãŸãã¯å¯Ÿå¿ããæŽæ°ã§ããå¿
èŠããããããäœãééã£ãããšãæžããŠãé©ãããšã§ã¯ãããŸããã ãšã©ãŒãé²ãããã«ããããè¡ãããšãã§ããŸãïŒ
process.kill(process.pid, os.constants.signals.SIGTERM);
10. IPã¢ãã¬ã¹ã®ç¢ºèª
Node.jsã«ã¯ã
IPã¢ãã¬ã¹ã
ãã§ãã¯ããããã®çµã¿èŸŒã¿ããŒã«ããã
ãŸã ã ãããè¡ãããã«ãæ£èŠè¡šçŸãè€æ°åèšè¿°ããŠããŸããã ããå€ãã®å¿ã®ããã«ååã§ã¯ãªãã£ãã æ£ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
require(`net`).isIP(`10.0.0.1`)
4
ãè¿ããŸãã
require(`net`).isIP(`cats`)
0
ãè¿ã
0
ã
ããã§ããç«ã¯IPã¢ãã¬ã¹ã§ã¯ãããŸããã
äŸã§ã¯ãæååã«äžéåŒçšç¬Šã䜿çšããŠããããšã«æ°ã¥ãããããããŸããã ç§ã¯ãããè¡ãã®ã奜ãã§ãããå¥åŠã«èŠãããšæãã®ã§ãç§ã¯ãããèšåããå¿
èŠããããšèããŸãããç§èªèº«ã¯æ¬åœã«çç±ãç¥ããŸããã äžè¬çã«ãããã¯ç§ã®ã¹ã¿ã€ã«ã§ãã
11.è¡æ«æåãos.EOL
ã³ãŒãã§è¡æ«æåãæå®ããããšããããŸããïŒ ãïŒ ãã¹ãŠãå
ãæ¶ããŸãã ããã§ã¯ãç¹ã«ãããè¡ã£ã人ã«ãšã£ãŠã¯çŽ æŽãããããšã§ãïŒ
os.EOL
ã Windowsã§ã¯ãä»ã®ãã¹ãŠã®OSã§
\r\n
ã«ãªããŸã-
\n
ã
os.EOL
ãšãç°ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã éã§äžè²«ããã³ãŒãåäœãå¯èœã«ãªããŸãã
å·çæç¹ã§ã¯ããã®ãããã¯ã®å
容ãååã§ã¯ãªããããããã§ä¿®æ£ããŸãã ãã®æçš¿ã®ä»¥åã®ããŒãžã§ã³ã®èªè
ã¯ã
os.EOL
ã䜿çšãããšåé¡ãçºçããå¯èœæ§ãããããšãææããŸããã äºå®ãããã§ã¯ç¹å®ã®ãã¡ã€ã«ã§CRLFïŒ
\r\n
ïŒãŸãã¯LFïŒ
\n
ïŒã®ããããã䜿çšã§ãããšããä»®å®ããé²ãå¿
èŠããããŸããããã®ãããªä»®å®ãå®å
šã«ç¢ºä¿¡ããããšã¯ã§ããŸããã
ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãããããç¹å®ã®æ¹è¡ãªãã·ã§ã³ã®äœ¿çšã匷å¶ãããå Žåã
eslintã«ãŒã«ããããŸãã 確ãã«ãGitãããã¹ãã§æ©èœããå Žåã¯åœ¹ã«ç«ã¡ãŸããã
ããã§ãã
os.EOL
ã¯åœ¹ã«ç«ããªãããã¡ãã§ã¯ãããŸããã ããšãã°ããã®ããšã¯ãä»ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«è»¢éããäºå®ã®ãªããã°ãã¡ã€ã«ãçæããå Žåã«åœ¹ç«ã¡ãŸãã ãã®å Žåã
os.EOL
ã¯ãããšãã°Windows Serverã§äœ¿çšãããŠããã¡ã¢åž³ã衚瀺ããããã«ããã®ãããªãã¡ã€ã«ã®æ£ãã衚瀺ãä¿èšŒããŸãã
const fs = require(`fs`); // CRLF fs.readFile(`./myFile.txt`, `utf8`, (err, data) => { data.split(`\r\n`).forEach(line => { // - }); }); // const os = require(`os`); fs.readFile(`./myFile.txt`, `utf8`, (err, data) => { data.split(os.EOL).forEach(line => { // - }); });
12. HTTPã¹ããŒã¿ã¹ã³ãŒã
ããŒãã«ã¯ãHTTPã¹ããŒã¿ã¹ã³ãŒããšãã®ååãå«ããåç
§ãããããŸãã ç§ã¯
http.STATUS_CODES
ãªããžã§ã¯ãã«ã€ããŠè©±ããŠ
http.STATUS_CODES
ãŸãã ãã®ããŒã¯ç¶æ
ã³ãŒãã§ãããå€ã¯ãã®ååã§ãã
ãªããžã§ã¯ãhttp.STATUS_CODES䜿çšæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
someResponse.code === 301; // true require(`http`).STATUS_CODES[someResponse.code] === `Moved Permanently`; // true
13.ãµãŒããŒã®äžèŠãªã·ã£ããããŠã³ã®é²æ¢
以äžã®ãããªã³ãŒãããµãŒããŒã®ã·ã£ããããŠã³ã«ã€ãªããããšã¯ãç§ã«ãšã£ãŠãã€ãå°ãå¥åŠã«æããŸããã
const jsonData = getDataFromSomeApi(); // ! ! const data = JSON.parse(jsonData); // .
ãã®ãããªãã³ã»ã³ã¹ãé²ãããã«ãNode.jsã®ã¢ããªã±ãŒã·ã§ã³ã®å
é ã«ã
æªåŠçã®äŸå€ãã³ã³ãœãŒã«ã«è¡šç€ºãããããªæ§é ãé
眮ã§ããŸãã
process.on(`uncaughtException`, console.error);
ãã¡ãããç§ã¯æ£ããèãã«ããã®ã§ãç§ã¯
PM2ã䜿çšããŠãã§ããéããã¹ãŠãã©ããããŸã
tryâŠcatch
泚æããããã«ããã°ã©ã ãããšãã«ãããã¯ã
tryâŠcatch
ãŸãããããŒã ãããžã§ã¯ãã§ã¯...
ãã®ã¢ãããŒãã¯æ±ºããŠã
éçºã®ãã¹ããã©ã¯ãã£ã¹ ãã®1ã€ã§ã¯ãªãã倧èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã®äœ¿çšã¯ããããæªãèãã§ãããšããäºå®ã«ç¹ã«æ³šæãåèµ·ããããšæããŸãã 誰ããæžããããã°æçš¿ãä¿¡é Œããããå
¬åŒã®ããã¥ã¡ã³ããä¿¡é Œããããèªåã§æ±ºããŠãã ããã
14.äžåºŠã ãã®çãèšèïŒïŒ
on()
ã¡ãœãã
on()
å ããŠã
EventEmitter
ãªããžã§ã¯ã
EventEmitter
ã¯
once()
ã¡ãœããããããŸãã ç§ã¯ãã®ããšãå°çäžã§æåŸã«ç¥ã£ãŠãã人ã§ãããšç¢ºä¿¡ããŠããŸãã ãããã£ãŠãç§ã¯èª°ããç解ã§ããåçŽãªäŸã«ãšã©ãŸããŸãã
server.once(`request`, (req, res) => res.end(`No more from me.`));
15.ã«ã¹ã¿ãã€ãºå¯èœãªã³ã³ãœãŒã«
ã³ã³ãœãŒã«ã¯ã以äžã®èšèšã䜿çšããŠæ§æã§ããç¬èªã®åºåã¹ããªãŒã ãæž¡ããŸãã
new console.Console(standardOut, errorOut)
ãªãã§ïŒ ããåãããŸããã ãã¶ããããŒã¿ããã¡ã€ã«ããœã±ããããŸãã¯ä»ã®å Žæã«åºåããã³ã³ãœãŒã«ãäœæããããããããŸããã
16. DNSã¯ãšãª
NodeãDNSã¯ãšãªã®çµæã
ãã£ãã·ã¥ããŠããªãããšãå£èª¬ãã ã ãããã£ãŠãç¹å®ã®URLã«è€æ°åã¢ã¯ã»ã¹ãããšãäžèŠãªã¯ãšãªã«è²Žéãªããªç§ãè²»ããããŸãã ãã®å Žåã
dns.lookup()
ã䜿çšããŠèªåã§DNSã¯ãšãªãå®è¡ããçµæããã£ãã·ã¥ã§ããŸãã ãŸãã¯ãåãããšãè¡ã
dnscacheããã±ãŒãžã䜿çšããŸãã
dns.lookup(`www.myApi.com`, 4, (err, address) => { cacheThisForLater(address); });
17. FSã¢ãžã¥ãŒã«ïŒå°é·å
ããã°ã©ãã³ã°ã¹ã¿ã€ã«ãç§ã®ãã®ã«äŒŒãŠããå Žåãã€ãŸãããããã¥ã¡ã³ããæãã«èªã¿ãåäœãããŸã§ã³ãŒããããããŸãããšãããããªãã®ã§ããã°ã
fs
åé¡ããå®å
šã§ã¯ãããŸããã éçºè
ã¯NodeãšããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã®çžäºäœçšãçµ±åããããšãç®æããŠçŽ æŽãããä»äºãããŸãããããã®å¯èœæ§ã¯ç¡éã§ã¯ãããŸããã ãã®çµæãããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®æ©èœã¯ãæ¡æãããéããµã³ãŽç€ã®ãããªã³ãŒãã®æµ·ã®è¡šé¢ãç Žå£ããŸãã ãã®ãã©ãã§ã¯ããµã³ãŽç€ã®1ã€ã«ä¹ãããšãã§ããããŒãã®åœ¹å²ãæãããŸãã
æ®å¿µãªããã
fs
é¢é£ããéãã¯ãéåžžã®ãWindowsãšä»ã®ãã¹ãŠã®ãŠãŒã¶ãŒãã«èŠçŽãããŠããªãããããWindowsã䜿çšãããŠãŒã¶ãŒããšããèãã®è£ã«ãããæ¯ãåãããšã¯ã§ããŸããã ïŒæåã¯ãããã§Webéçºã«ãããåWindowsææ
ã«ã€ããŠã®ã¹ããŒãå
šäœãæžããŸããããæçµçã«ãããåé€ããããšã«ããŸããããããªããã°ãç§ã®èª¬æããç§ã®é¡ã«ç®ãè¡ããŸããïŒã
ããã§ãäžèšã§èšãã°ã
fs
ã¢ãžã¥ãŒã«ã®ããã¥ã¡ã³ãã§èŠã€ãããã®ã§ãã ãããã®å瀺ã¯ãæããé¶ãããæªããªã人ããããšæããŸãã
fs.stats(),
ã«ãã£ãŠè¿ããããªããžã§ã¯ãã®mode
ããããã£ã¯ãWindowsãšä»ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ç°ãªããŸãã Windowsã§ã¯ã fs.constants.S_IRWXU
ãªã©ã®ãã¡ã€ã«ã¢ã¯ã»ã¹ã¢ãŒãå®æ°ã«å¯Ÿå¿ããªãå ŽåããããŸãã
fs.lchmod()
é¢æ°ã¯macOSã§ã®ã¿äœ¿çšå¯èœã§ãã
type
ãã©ã¡ãŒã¿ãŒãæå®ããfs.symlink()
åŒã³åºãã¯ãWindowsã§ã®ã¿ãµããŒããããŠããŸãã
fs.watch()
é¢æ°ã«æž¡ãããšãã§ããrecursive
ãªãã·ã§ã³ã¯ãWindowsããã³macOSã§ã®ã¿æ©èœããŸãã
fs.watch()
ã³ãŒã«ããã¯é¢æ°ã¯ãLinuxããã³Windowsã§ã®ã¿ãã¡ã€ã«åãåãå
¥ããŸãã
- ãã£ã¬ã¯ããªã®
a+
ãã©ã°ãæå®ããŠfs.open()
ãåŒã³åºããšãFreeBSDããã³Windowsã§åäœããŸãããmacOSããã³Linuxã§ã¯åäœããŸããã
- Linuxã§
fs.write()
æž¡ãããposition
ãã©ã¡ãŒã¿ãŒã¯ããã¡ã€ã«ãæ¥ç¶ã¢ãŒãã§éãããŠããå Žåã¯ç¡èŠãããŸãã ã«ãŒãã«ã¯äœçœ®ãç¡èŠãããã¡ã€ã«ã®æåŸã«ããŒã¿ãè¿œå ããŸãã
ïŒç§ã¯ãã¡ãã·ã§ã³ã«é
ãããšã£ãŠããªããç§ã¯Appleã®OSããmacOSããšåŒãã§ããããå€ãååã§ããOS Xãå¥ã®äžçã«è¡ã£ãŠãã2ãæçµã£ãŠããªããïŒ
18.ãããã¢ãžã¥ãŒã«ã¯httpã¢ãžã¥ãŒã«ã®2åã®é床ã§ã
Node.jsã®ããã¥ã¡ã³ããèªãã§ã
net
ã¢ãžã¥ãŒã«ãéèŠã§ããããšã«æ°ä»ããŸããã ããã¯
http
ã¢ãžã¥ãŒã«ã®äžã«ãããŸãã ããã«ããããµãŒããŒã®çžäºäœçšãæŽçããå¿
èŠãããå ŽåïŒå€æãããããå¿
èŠãªå ŽåïŒã
net
ã¢ãžã¥ãŒã«ã®ã¿ã䜿çšãã䟡å€ããããšæããŸããã
ã·ã¹ãã ã®ãããã¯ãŒãã³ã°ã«å¯æ¥ã«é¢äžããŠãã人ã¯ããã®ãããªè³ªåãããå¿
èŠããããšã¯ãŸã£ããä¿¡ããªããããããŸããããç§ã¯çªç¶ãµãŒããŒã®äžçã«é¥ããHTTPã®ã¿ãç¥ã£ãŠããWebéçºè
ã§ãã ããããã¹ãŠã®TCPããœã±ãããã¹ããªãŒã ã«é¢ãããã¹ãŠã®ãã®ãããã¹ã...ç§ã«ãšã£ãŠã¯ã
æ¥æ¬ã®ã©ããã®ãããªãã®ã§ãã ã€ãŸããç§ã«ã¯ç解ã§ããªãããã«æããŸãããèå³ããããããããã«èãããŸãã
ãããç解ãã
net
ãš
http
ã§å®éšããããããæ¯èŒããããã«ãããã€ãã®ãµãŒããŒãã»ããã¢ãããïŒæ¥æ¬èªã®ã©ãããèããŠããããšãé¡ã£ãŠããŸãïŒããªã¯ãšã¹ããããŒãããŸããã ãã®çµæã
http.Server
ã¯1ç§ãããçŽ3400ã®ãªã¯ãšã¹ããåŠçã§ãã
http.Server
ã¯çŽ5500ã§ãããããã«ã
net.Server
ç°¡åã§ãã
èå³ãããã°ãç§ãå®éšããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ã³ãŒãã èå³ããªãå Žåã¯ãããŒãžãé·æéã¹ã¯ããŒã«ããå¿
èŠãããããšããizeã³ããŸãã
ããã
client.jsã®ã³ãŒãã§ãã
// . â TCP-, â HTTP ( server.js). // . // . const net = require(`net`); const http = require(`http`); function parseIncomingMessage(res) { return new Promise((resolve) => { let data = ``; res.on(`data`, (chunk) => { data += chunk; }); res.on(`end`, () => resolve(data)); }); } const testLimit = 5000; /* ------------------ */ /* -- NET client -- */ /* ------------------ */ function testNetClient() { const netTest = { startTime: process.hrtime(), responseCount: 0, testCount: 0, payloadData: { type: `millipede`, feet: 100, test: 0, }, }; function handleSocketConnect() { netTest.payloadData.test++; netTest.payloadData.feet++; const payload = JSON.stringify(netTest.payloadData); this.end(payload, `utf8`); } function handleSocketData() { netTest.responseCount++; if (netTest.responseCount === testLimit) { const hrDiff = process.hrtime(netTest.startTime); const elapsedTime = hrDiff[0] * 1e3 + hrDiff[1] / 1e6; const requestsPerSecond = (testLimit / (elapsedTime / 1000)).toLocaleString(); console.info(`net.Server handled an average of ${requestsPerSecond} requests per second.`); } } while (netTest.testCount < testLimit) { netTest.testCount++; const socket = net.connect(8888, handleSocketConnect); socket.on(`data`, handleSocketData); } } /* ------------------- */ /* -- HTTP client -- */ /* ------------------- */ function testHttpClient() { const httpTest = { startTime: process.hrtime(), responseCount: 0, testCount: 0, }; const payloadData = { type: `centipede`, feet: 100, test: 0, }; const options = { hostname: `localhost`, port: 8080, method: `POST`, headers: { 'Content-Type': `application/x-www-form-urlencoded`, }, }; function handleResponse(res) { parseIncomingMessage(res).then(() => { httpTest.responseCount++; if (httpTest.responseCount === testLimit) { const hrDiff = process.hrtime(httpTest.startTime); const elapsedTime = hrDiff[0] * 1e3 + hrDiff[1] / 1e6; const requestsPerSecond = (testLimit / (elapsedTime / 1000)).toLocaleString(); console.info(`http.Server handled an average of ${requestsPerSecond} requests per second.`); } }); } while (httpTest.testCount < testLimit) { httpTest.testCount++; payloadData.test = httpTest.testCount; payloadData.feet++; const payload = JSON.stringify(payloadData); options[`Content-Length`] = Buffer.byteLength(payload); const req = http.request(options, handleResponse); req.end(payload); } } /* -- Start tests -- */ // flip these occasionally to ensure there's no bias based on order setTimeout(() => { console.info(`Starting testNetClient()`); testNetClient(); }, 50); setTimeout(() => { console.info(`Starting testHttpClient()`); testHttpClient(); }, 2000);
ããã
server.jsã§ãã
// . â TCP, â HTTP. // JSON, , . const net = require(`net`); const http = require(`http`); function renderAnimalString(jsonString) { const data = JSON.parse(jsonString); return `${data.test}: your are a ${data.type} and you have ${data.feet} feet.`; } net .createServer((socket) => { socket.on(`data`, (jsonString) => { socket.end(renderAnimalString(jsonString)); }); }) .listen(8888); function parseIncomingMessage(res) { return new Promise((resolve) => { let data = ``; res.on(`data`, (chunk) => { data += chunk; }); res.on(`end`, () => resolve(data)); }); } http .createServer() .listen(8080) .on(`request`, (req, res) => { parseIncomingMessage(req).then((jsonString) => { res.end(renderAnimalString(jsonString)); }); });
19. REPLã¢ãŒãã®ããªãã¯
- REPLã¢ãŒãã§äœæ¥ããå Žåãã€ãŸããã¿ãŒããã«
node
æžã蟌ãã§EnterãæŒããšã .load someFile.js
ãããªã³ãã³ããå
¥åã§ããã·ã¹ãã ã¯èŠæ±ããããã¡ã€ã«ãããŒãããŸãïŒããšãã°ããã®ãããªãã¡ã€ã«ã«äžé£ã®å®æ°ãèšå®ã§ããŸãïŒã
- ãã®ã¢ãŒãã§ã¯ãç°å¢å€æ°
NODE_REPL_HISTORY=""
ãèšå®ããŠããã¡ã€ã«ãžã®å±¥æŽã®æžã蟌ã¿ãç¡å¹ã«ããããšãã§ããŸãã ããã«ãéå»ã«ç§»åã§ããREPLå±¥æŽãã¡ã€ã«ã~/.node_repl_history
ä¿åãããŠããããšãããããŸããïŒå°ãªããšãèŠããŠããŸãïŒã
- ã¢ã³ããŒã¹ã³ã¢æåã
_»
ã¯ãæåŸã«å®è¡ãããåŒã®çµæãæ ŒçŽããå€æ°ã®ååã§ãã 圹ã«ç«ã€ãšæãã
- NodeãREPLã¢ãŒãã§èµ·åãããšãã¢ãžã¥ãŒã«ã¯èªåçã«ïŒããæ£ç¢ºã«ã¯ãèŠæ±ã«å¿ããŠïŒããŒããããŸãã ããšãã°ãã³ãã³ãã©ã€ã³ã§
os.arch()
ãšå
¥åããã ãã§ãOSã®ã¢ãŒããã¯ãã£ã確èªã§ããŸãã require(`os`).arch();
ãããªæ§é å¿
èŠãããŸããã
ãŸãšã
ã芧ã®ãšãããããã¥ã¡ã³ããèªãããšã¯è¯ãããšã§ãã ãã®å°åã§ãããããããã®æ°ãããã®ãèŠã€ããããšãã§ããŸãã ç§ã®çºèŠãã圹ã«ç«ãŠã°å¹žãã§ãã
ãšããã§ãNode.jsã«ã€ããŠä»ã«èå³æ·±ãããšã¯ãããŸããïŒ ãããããªã-å
±æ:)