書籍「入門Node.jsプログラミング 」のまとめ。
点数
75点
感想
node.jsでexpressを使ってWEBアプリを作成するという内容だった。
機能を1つずつ説明しながら追加していく流れなので、処理の意味を理解しやすかった。
ただし、小規模のWEBアプリであれば本書の内容で問題ないが、ある程度の規模になると実装・運用は難しいのではないかと感じた。
Lesson3
Node.jsモジュールを作る
- exportsオブジェクトにプロパティを追加すると、モジュール間で共有できるようになる。
- exportsはmodule.exportsの省略形であり、exportsオブジェクトはmoduleオブジェクトのプロパティである。
- require()はmodule.require()の省略形であり、require関数はmoduleオブジェクトの関数である。
- moduleはNode.jsのグローバルオブジェクトのひとつである。
exports.messages = [
'アイウエオ',
'かきくけこ'
];
const messageModule = require('./messages');
messageModule.messages.forEach(m => console.log(m));
Lesson4
Webサーバを作る
- インストール
npm init
npm install http-status-codes - httpモジュールはNode.jsと一緒にインストールされる。
const port = 3000;
const http = require('http');
const httpStatusCodes = require('http-status-codes');
const app = http.createServer((request, response) => {
console.log('receive a request.');
response.writeHead(httpStatusCodes.OK, {
'Content-Type': 'text/html'
});
const msg = '<h1>Hello</h1>';
response.write(msg);
response.end();
console.log(`send a response. (${msg})`);
});
app.listen(port);
console.log(`listening on port ${port}`);
Lesson5
受け取ったデータを処理する
const port = 3000;
const http = require('http');
const httpStatusCodes = require('http-status-codes');
const app = http.createServer();
app.on('request', (req, res) => {
let body = [];
req.on('data', (bodyData) => {
// 引数として渡されるのはBufferオブジェクト。
body.push(bodyData)
});
req.on('end', () => {
console.log(Buffer.concat(body).toString());
});
res.writeHead(httpStatusCodes.OK, {
'Content-Type': 'text/html'
});
res.end('<form method="post"><input type="text" name="name"><input type="submit" value="send" name="hoge"></form>');
});
app.listen(port);
console.log(`listening on port ${port}`);
- 経路を加える。
const routeResponses = {
'/info': '<h1>Info Page</h1>',
'/contact': '<h1>Contact Us</h1>',
}
app.on('request', (req, res) => {
res.writeHead(httpStatusCodes.OK, {
'Content-Type': 'text/html'
});
if (routeResponses[req.url]) {
res.end(routeResponses[req.url]);
} else {
res.end('<h1>Default Page</h1>');
}
});
Lesson6
fsモジュールを使う
- 外部ファイル化したHTMLをfsモジュールで読み込む。
- fsモジュールはNode.jsと一緒にインストールされる。
const fs = require('fs');
const app = http.createServer();
app.on('request', (req, res) => {
fs.readFile(`${req.url.replace('/', '')}`, (err, data) => {
if (err) {
res.writeHead(httpStatusCodes.NOT_FOUND, {
'Content-Type': 'text/html'
});
res.write('<h1>not found</h1>');
res.end();
return;
}
if (req.url.indexOf('.jpg') !== -1) {
res.writeHead(httpStatusCodes.OK, {
'Content-Type': 'image/jpeg'
});
} else {
res.writeHead(httpStatusCodes.OK, {
'Content-Type': 'text/html'
});
}
res.write(data);
res.end();
});
});
経路を別ファイルに移す
const port = 3000;
const http = require('http');
const router = require("./router");
http.createServer(router.handle).listen(3000);
console.log(`listening on port ${port}`);
'use strict';
const httpStatusCodes = require('http-status-codes');
const fs = require('fs');
const customReadFile = (file, res) => {
fs.readFile(`./${file}`, (errors, data) => {
if (errors) {
console.log("Error reading the file...");
}
res.end(data);
});
};
const routes = {
GET: {
'/info': (req, res) => {
res.writeHead(httpStatusCodes.OK, {
'Content-Type': 'text/plain'
});
res.end('Welcome to the Info Page!');
},
"/": (req, res) => {
res.writeHead(httpStatusCodes.OK, 'Content-Type: text/html');
customReadFile("index.html", res);
},
},
POST: {}
};
exports.handle = (req, res) => {
try {
if (routes[req.method][req.url]) {
routes[req.method][req.url](req, res);
} else if (req.url.indexOf('.jpg') !== -1) {
res.writeHead(httpStatusCodes.OK, {
'Content-Type': 'image/jpeg'
});
customReadFile(req.url, res);
} else {
res.writeHead(httpStatusCodes.NOT_FOUND, 'Content-Type: text/html');
res.end('<h1>No such file exists</h1>');
}
} catch (ex) {
console.log(`error: ${ex}`);
}
};
// 経路登録用関数
exports.get = (url, action) => {
routes['GET'][url] = action;
};
exports.post = (url, action) => {
routes['POST'][url] = action;
};
コメント