node.js, express, apache, proxy server: 個人的メモ

June 2, 2016 – 7:49 pm

サーバーサイドのJavaScript環境node.jsに興味を持ち、いろいろ学習している。

Web上に公開されている入門サイトを参考に、node.js上で動作するWebアプリのフレームワークexpressを用いたWebサーバ作成の基本を学んだ。作成したWebサーバを、apacheのproxy機能を活用して外部に公開する手続きも試してみた。

一連の学習内容をmemoしておいた。

node.js そのもとでの express の動作環境を構築したのち、REST形式のWebサーバーの簡単なシステムを実装した。実装にあたっては、Web技術の学習サイト「ドットインストール」のExpress 入門を参考にした。

なお、以下の実装にあたっては、ドットインストールとは異なりExpressのバージョンは4.xを用いている。

関連ファイルのディレクトリ構造

  -- +---- server.js
     |
     +---- views      ---+---  index.ejs
                         |
                         +---  show.ejs
                         |
                         +---  new.ejs
                         |
                         +---  edit.ejs

     *---- node_modules -+--- express
                         |
                        +--- body-parser
                        |
                        *--- ( ----  )

上記のうち、node_modules の部分は、ここに必要なモジュールが配置されていることを簡略的に表現している。

以下、上記のディレクトリ構造に示されているソースを示す。

server.js

var express = require('express');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');

var app = express();

app.set('views', __dirname + '/views');
app.set('view engine', 'ejs' );

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(methodOverride(function(req, res){
  if (req.body && typeof req.body === 'object' && '_method' in req.body) {
      // look in urlencoded POST bodies and delete it
      var method = req.body._method;
      delete req.body._method;
      return method;
  }
}) );

var posts = [
   {title: 'title0', body: 'body0'},
   {title: 'title1', body: 'body1'},
   {title: 'title2', body: 'body2'}
];

app.get('/', function(req,res) {
     res.render('index', {posts:posts});
});
app.get('/posts/:id([0-9]+)', function(req,res) {
     res.render('show', {posts:posts[req.params.id]});
});
app.get('/posts/new', function(req,res) {
    res.render('new'); 

});
app.post('/posts/create', function(req,res) {
     var post = {
         title: req.body.title,
         body:  req.body.body
     };
     posts.push(post);
     res.redirect('/');
});
app.get('/posts/:id/edit', function(req,res) {
    res.render('edit',{posts:posts[req.params.id], id:req.params.id});
});
app.put('/posts/:id([0-9]+)', function(req,res) {
   posts[req.body.id] = {
       title: req.body.title,
       body: req.body.body
   };
   res.redirect('/');
});
app.delete('/posts/:id/', function(req,res) {
    posts.splice(req.body.id, 1);
    res.redirect('/');
});

app.listen( 8081, function() {
    console.log("listening on port no. 8081 "  );
});

   
   
views/index.ejs

<!doctype html>
<html lang='ja'>
  <head>
    <title>Blog</title>
  </head>
  <body>
    <h1>Posts</h1>
    <ul>
      <% for ( var i=0; i<posts.length; i++ ) { %>
      <li>
        <a href="/posts/<%= i %>"><%= posts[i].title %></a>
        <a href="/posts/<%= i %>/edit/">[Edit]</a>
        <form method="post" action="/posts/<%= i %>">
           <input type="submit" value="del">
           <input type="hidden" name="_method" value="delete">
           <input type="hidden" name="id" value="<%= i %>">
        </form>
      </li>
      <% } %>
    </ul>
    <a href="/posts/new">Add New</a>
  </body>
</html>

   
   
views/show.ejs

<!doctype html>
<html lang='ja'>
  <head>
    <title>Blog</title>
  </head>
  <body>
    <h1><%= posts.title %></h1>
    <p><%= posts.body %></p>
    <p><a href="/">Go Back</a></p>
  </body>
</html>

   
   
views/new.ejs

<!doctype html>
<html lang='ja'>
  <head>
    <title>Add new</title>
  </head>
  <body>
    <h1>Add New</h1>
    <form method="post" action="/posts/create">
       <input type="text" name="title">
       <input type="text" name="body">
       <input type="submit" value="add">
    </form>
    <p><a href="/posts/new">Add new</a></p>
  </body>
</html>

   
   
views/edit.ejs

<!doctype html>
<html lang='ja'>
  <head>
    <title>Edit</title>
  </head>
  <body>
    <h1>Edit</h1>
    <form method="post" action="/posts/<%=id %>" >
       <input type="text" name="title" value="<%= posts.title %>" >
       <input type="text" name="body" value="<%= posts.body %>" >
       <input type="hidden" name="id" value="<%= id %>">
       <input type="hidden" name="_method" value="put">
       <input type="submit" value="Update">
    </form>
    <p><a href="/">Go back</a></p>
  </body>
</html>

   
nodeコマンドによるサーバーの起動:   

$ node server.js
listening on port no. 8081 

   
   
外部に公開するためapacheのproxy設定
/etc/httpd/httpd.confの関連部のみを以下に示す。

#
NameVirtualHost *:80
#

<VirtualHost *:80>
    ServerName sample.yamasnet.com
    ProxyPass / http://localhost:8081/
    ProxyPassReverse / http://localhost:8081/
</VirtualHost>

    
    
参考にしたサイト:


Post a Comment