サーバーサイド(node.js)を学び始める
【所要時間】
1時間10分(2018年11月21日)
【概要】
- node.jsを理解する
【要約・学んだこと】
以前少しだけ勉強(Reactを勉強する前にやっていた。)した内容を読み返してもあまり理解できなかったので、日本語でざっくりと基礎的な部分を掴みたい。
39. A Beginner’s Guide to npm — the Node Package Manager https://link.medium.com/RX0w1YKc1R
日本語の教材がほぼほぼ古くて困った(2013年とか2015年に作られたものが多い)が、とりあえず無料でサクッと概要を掴めそうなドットインストールで学ぶことにした。(全16回1回約3分の動画)1時間で終わるならとっとと見た方が早い。
以下 学んだ内容の個人的な解釈
- スレッドモデル(Apatche)
リクエストごとにスレッドを作って対処するが、メモリを消費するので、大量にリクエストが発生すると待ち時間が発生する。 - イベントループ(Node.js)
リクエストが来るたびにキューに登録していく。イベントループが回ってくるごとにキューにあるリクエストを確認し、バックグラウンドで処理していく。次のループでは何の処理が終わったのかも確認しており、処理が終わっていなくても、リクエストを受け付けることができる。
欠点は処理が終わる順番がいまいちわからないこと。ループをブロックしないように処理を書かなければいけない。 - まずはhello world
// hello.jsconsole.log("hello world")
ターミナルで node hello.js と入力すると
できた。
setTimeout(() => {
console.log("hello");
}, 1000);
console.log("world");
このようにコールバック関数(functionに引数としてfunctionを渡す)で次のリクエストをブロックしないように記述しないと、処理が終わるまで次の処理を読み込めないので注意。
- サーバーを作る。
const http = require('http');
const server = http.createServer();
server.on('request', (req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('hello worddddld');
res.end();
});server.listen(8000, 'local host');
console.log('server listening ...');
記述方法などは変わっている(もっとモダンな書き方)がある可能性もあるので、あまり深く考えずにやっていく。
- 設定を外部からインポートする。
先ほどの設定を別ファイルに記述する。
// settings.jsexports.port = 8000;
exports.host = 'localhost';// server.jsconst http = require('http');
const settings = require('./settings')
const server = http.createServer();
server.on('request', (req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('hello worddddld');
res.end();
});server.listen(settings.port, settings.host);
console.log('server listening ...');
- アクセスしてきたURLに応じて処理を変える。
const http = require('http');
const settings = require('./settings')
const server = http.createServer();
let msg;
server.on('request', (req, res) => {
switch (req.url) {
case '/about':
msg = "about this page";
break;
case '/profile':
msg = "about me";
break;
default:
msg = "wrong page";
break;
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write(msg);
res.end();
});server.listen(settings.port, settings.host);
console.log('server listening ...');
このようにurlによって処理を変えることができる。
- HTMLファイルを読み込む。
const http = require('http');
fs = require('fs');
const settings = require('./settings')
const server = http.createServer();
let msg;
server.on('request', (req, res) => {
fs.readFile(__dirname + '/public/hello.html', 'utf-8', function(err, data){
if(err) {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.write('not found ...');
return res.end();
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
res.end();
});
});server.listen(settings.port, settings.host);
console.log('server listening ...');
fs = require(‘fs’) がファイルシステムのモジュールで、これによりファイルを読み込むことができる。
errの場合not found …を表示し、ファイルが読み込めたらそのdataを表示する。
ファイルにアクセスできないと
not foundが表示された。
【わからなかったこと】
特になし。
【感想】
とりあえず半分のレッスン8まで終わらせた。ドットインストールやprogateといった日本で有名なチュートリアルは、説明をスキップせず、必要な前提知識があってもさらっと説明してくれるので、スムーズに進められて助かる。
まだ見慣れない部分が多いが、これらのコードに慣れれば難しい点は今の所ない。