「入門Node.jsプログラミング 」の感想・備忘録1

スポンサーリンク

書籍「入門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;
};

コメント