Raspberry Pi 3のnode.js上で、Node.jsで使う MVCフレームワーク「Express」からExpressのテンプレートエンジン「EJS」を使います。
Raspberry Pi 3にExpress4のインストール
node.jsは「Raspberry Pi 3にNode.jsのインストール」ですでにインストールしました。Expressバージョン4を次の手順でインストールします。
$ npm install -g express
端末には次のように表示されます。
Express version 4 以降は 「express-generator」をインストールすることで、 Web アプリケーションのテンプレートを生成できます。-gでクローバル環境でのインストールとなります。
$ npm install -g express-generator
端末には次のように表示されます。
ホームの下に、.nvmができました。このままだと、使えないので次のexportを.bash_profileファイルに作成して、node.jsのパスを通します。
.bash_profile export PATH=/home/pi/.nvm/versions/node/v6.9.2/bin:$PATH export NODE_PATH=/home/pi/.nvm/versions/node/v6.9.2/lib/node_modules
「nvm」と「npm」の違い
・nvm(Node Version Manager) : Node.js 自体をバージョン管理するツール
・npm(Node Package Manager) : Node.js で作られたパッケージモジュールを管理するツール。npmは Node.js をインストールすれば一緒にインストールされます
expressのEJSを用いてwebサーバの構築
expressを用いて簡単なwebサーバを作ってみます。テンプレートエンジンとしてEJSを使います。次のexpressコマンドを入力します。-eでテンプレートエンジンEJSが指定できます。今回はhelloというプロジェクト名にします。
$ express -e hello
次のような結果が出力され、helloディレクトリが作成されます。
  warning: option `--ejs' has been renamed to `--view=ejs'
   create : hello
   create : hello/package.json
   create : hello/app.js
   create : hello/public
   create : hello/routes
   create : hello/routes/index.js
   create : hello/routes/users.js
   create : hello/views
   create : hello/views/index.ejs
   create : hello/views/error.ejs
   create : hello/bin
   create : hello/bin/www
   create : hello/public/javascripts
   create : hello/public/stylesheets
   create : hello/public/stylesheets/style.css
   install dependencies:
     $ cd hello && npm install
   run the app:
     $ DEBUG=hello:* npm start
   create : hello/public/images
次に、「index.js」のコードを変更します。’TomoSoft’という文字列をtitleとしてテンプレートファイル「index.ejs」に渡します。
./routes/index.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'TomoSoft' });
});
module.exports = router;
次のコマンドで、フォルダ「hello」に移動後、npm installをします。
$ cd hello&& npm install
そして、以下のコマンドより実行します。
$ DEBUG=hello:* npm start
ブラウザを立ち上げて “http://[ラズパイIPアドレス]:3000” にアクセスすると、次のように、”TomoSoft”とブラウザに表示されます。
端末には次のように表示されます。
$ DEBUG=hello:* npm start > hello@0.0.0 start /home/pi/node_ejs/hello > node ./bin/www hello:server Listening on port 3000 +0ms GET / 304 117.734 ms - - GET /stylesheets/style.css 200 22.250 ms - 111 GET /favicon.ico 404 13.506 ms - 926
expressコマンドで作成されたファイル
expressコマンドで作成されたファイルの紐づけについて説明します。
./bin/www
app = require(‘../app’)で、app.jsを読み込んでいます。server.listen(port)によりサーバが起動し始めます。
#!/usr/bin/env node
/**
 * Module dependencies.
 */
var app = require('../app');
var debug = require('debug')('hello:server');
var http = require('http');
/**
 * Get port from environment and store in Express.
 */
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
 * Create HTTP server.
 */
var server = http.createServer(app);
/**
 * Listen on provided port, on all network interfaces.
 */
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
       ・・・
       ・・・
./package.json
npm は package.json という名前のファイルを作り、連携することでプロジェクト管理や、 環境のセットアップを簡単に行うことができます.
{
  "name": "hello",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.15.2",
    "cookie-parser": "~1.4.3",
    "debug": "~2.2.0",
    "ejs": "~2.5.2",
    "express": "~4.14.0",
    "morgan": "~1.7.0",
    "serve-favicon": "~2.3.0"
  }
}
./app.js
app.jsは、サーバの設定やビューエンジンの設定を行っています。ルートで表示する内容は “./routes/index.js” が出力した内容となります。
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var index = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
module.exports = app;
./routes/index.js
このファイルは先ほどのapp.jsと紐付されています。ルート(http://[ラズパイIP]:3000/)にアクセスしたときの処理が記述されています。res.render(‘index’, { title: ‘TomoSoft’ })により、テンプレートである”./view/index.ejs”を読み込みます。
このコードは上記で編集しました。
./routes/users.js
ユーザ管理を行う場合に使用します。
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});
module.exports = router;
./views/index.ejs
このファイルはindex.jsから使われます。記述されている<%= title %>により、titleの中身を使用することができます。titleの中身は、index.jsのrenderにより渡された文字列”TomoSoft”となります。実行すると、ブラウザに”TomoSoft”が表示されます
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
  </body>
</html>
./views/error.ejs
エラー用のテンプレートです。
<h1><%= message %></h1> <h2><%= error.status %></h2> <pre><%= error.stack %></pre>
./public/stylesheets/style.css
ブラウザに表示するときのスタイルシートを示します。
body {
  padding: 50px;
  font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}
a {
  color: #00B7FF;
}
							
											
				

