Sample – Bluemix DevOpsで作る Node.jsで動く 簡単サンプル

Bluemix のクラウド上の開発環境である DevOps を使って、簡単なNode.js の サンプルを作ってみました。プログラム言語は JavaScript です。まず以下のような、名前を表に追加していく簡単な画面のWebアプリを作ります。(この次のサンプルでデータを Cloudantに格納)

4.bm_apl画面結果

Bluemixに Node.jsと Cloudant をセットアップ

Bluemix にログインし、クラウド環境を構築します。
(=>Bluemixが初めての人は、まずこちらから)
Bluemix の初期ダッシュボード画面から、[アプリの作成] で [Web]、[SDK for Node.js] [続行] とクリックします。

1.bm_dashboard_apl

1.bm_web

1.bm_node.js

以下の [新規アプリの名前] で自分の好きな名前を入力して [完了] してください。(このサンプルでは「BMTable」という名前にしていますが、同じ名前は登録できないので、変えてください)

1.bm_apl

サーバー上での稼動が完了したら、以下の上部のように緑のチェックマークに(それまで下の 「GIT」 のところを読んでおく)。緑の稼動になったら、下にスクロールし [アプリの概要の表示] をクリックしてください。

1.bm_staging

1.bm_アプリ概要

以下が 「アプリの概要」 画面で、アプリケーションごとの操作はこの画面が中心になります。既にアプリはBluemixで稼動しているため、左上の [経路:] 右のリンクをクリックするとアプリの画面が表示されます。右上の [GITの追加] をクリックし、[続行]。

2.bm_アプリ概要

以下の [GIT URL:] に変わるため、右の [コードの編集] をクリックし開発環境である Bluemix DevOpsサービスに入ります。

2.bm_edit


Ajaxを使う Node.jsサンプル・アプリケーションの開発

次に、サンプル・アプリケーションを Ajaxを活用するよう変更します。このサンプルでは元から組み込まれている 「express」 のv4 に加え、「body-parser」 「date-utils」 というオープンソースを使います。
まず Bluemix DevOpsサービスの [EDIT CODE] の左のファイル・リストで 「package.json」 をクリックし、以下のように開いて、body-parser と date-utils の行を追加してください。

2.bm_edit_code

package.json は以下のコードになりますが、Node.jsアプリの実行環境の設定です。以下のように、最初にStartするコードはNode(.js)の 「app.js」 になります。
後半の dependencies に入っているのが使用するパッケージで、記入したパッケージ名のそのバージョンが、Bluemixの自動ビルド時に自動的に組み込まれます。具体的には、node_modulesディレクトリに該当バージョンがコピーされますが、画面上は表示されません。

{
 "name": "NodejsStarterApp",
 "version": "0.0.1",
 "description": "A sample nodejs app for Bluemix",
 "scripts": {
 "start": "node app.js"
 },
 "dependencies": {
 "express": "4.12.x",
 "cfenv": "1.0.x",
 "body-parser": "*",
 "date-utils": "*"
 },
 "repository": {},
 "engines": {
 "node": "0.12.x"
 } 
}

dependenciesのうち、「express」 はNode.jsの画面表示フレームワークで、「cfenv」 は Cloud Foundryの環境変数取得ユーティリティです。

最初に起動されるサーバー側の 「app.js」 は、以下のように変更しました。[/***ここから追加***/] のところからが追加した部分です。「app.post」 でブラウザからPOSTで送られてきたデータ req に「date-utils」 の 「Date()」 で日時を追加し、res.send で返します。

// This application uses express as its web server
// for more info, see: http://expressjs.com
var express = require('express');

// cfenv provides access to your Cloud Foundry environment
// for more info, see: https://www.npmjs.com/package/cfenv
var cfenv = require('cfenv');

// create a new express server
var app = express();

// serve the files out of ./public as our main files
app.use(express.static(__dirname + '/public'));

// get the app environment from Cloud Foundry
var appEnv = cfenv.getAppEnv();

/***ここから追加***/
// POSTパラメータ取得用 body-parser設定 (express4から必要)
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// Date()で現在時刻を取得するためのユーティリティ
var dateutil = require('date-utils');
 
app.post('/', function(req, res){
 var date = new Date();
 var now = date.toFormat("YYYY/MM/DD HH24:MI:SS");
 req.body.date = now;
 
 console.log('app.js req.body: ' + JSON.stringify(req.body));
 res.send(req.body);
});
/***ここまで追加***/

// start server on the specified port and binding host
app.listen(appEnv.port, '0.0.0.0', function() {

 // print a message when the server starts listening
 console.log("server starting on " + appEnv.url);
});

express v4からは、上記のように body-parser を use する必要がありますので、注意してください(req.bodyがundefinedでエラーになります)。

Node.jsにAjaxでデータを送る、Web画面サンプル

ブラウザに表示される画面の public フォルダ内の、index.html を以下のように変更します。

<!DOCTYPE html>
<html>

 <head>
 <title>NodeJS Starter Application</title>
 <meta charset="utf-8">
 <!--ここから追加-->
 <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
 <script type="text/javascript" src="js/ui_table.js"></script>
 <!--ここまで追加-->
 </head>

 <body>
 <!--ここから追加-->
 <table id="dataTable" border="1">
 <thead>
 <tr><th>時間</th><th>項目</th></tr>
 </thead>
 <tbody id='tableItems'></tbody>
 </table><br><br>

 <div id="form">
 <span>項目名: </span><span><input type="text" id="item1"></span><br>
 <button value="追加" id="add">追加</button>
 </div>
 <!--ここまで追加-->
 </body>

</html>

この index.html では、画面のボタンをクリックすると Ajax でサーバーの Node.js (app.js) を呼び出して日付を返す JavaScript、「ui_table.js」 を利用しています。上の画面イメージのように、publicフォルダを右クリックし [新規] [フォルダ] で 「js」 フォルダを作成し、その下に 「ui_table.js」 ファイルを作成し、以下をコピーしてください。

// ui_table.js ブラウザUI用 JavaScript (index.htmlより呼ばれる)

$(function(){
 // 追加ボタン(index.htmlのid=add)押下時 実行
 $("#add").click(function(e){
 e.preventDefault(); // エラー
 var param = {};
 param.item1 = $("#item1").val() || ""; // 入力された文字の取得

 // POSTでのajaxコールで、サーバーのapp.jsのapp.post呼び出し
 $.ajax({
 type: 'POST',
 data: JSON.stringify(param),
 contentType: 'application/json',
 url: '/',
 success: function(data) {
 console.log('add success: ' + JSON.stringify(data));
 showTable(data);
 },
 error: function(data) { console.log('error ' + JSON.stringify(data)); }
 });

 // 入力項目名を空白に
 $("#item1").val('');
 }); // #add

 // サーバから取得したデータを、htmlテーブルに追加
 var showTable = function(data) {
 $("#tableItems").append("<tr></tr>")
 .find("tr:last")
 .append("<td>" + data.date + "</td>")
 .append("<td>" + data.item1 + "</td>")
 };
 }); 

stylesheetsフォルダの style.css は今回は使わないので、削除して構いません。

稼動確認

一通りのコードが完成しましたので、以下の「デプロイ」ボタン 3.bm_deployB をクリックして、サーバーで稼動させます。

3.bm_deploy

次に 「アプリケーションを開く」 ボタン 3.bm_appliB をクリックして、Web画面を表示してください。以下の画面が開きますので、項目名に文字を入れて追加すると、Node.js の app.js にアクセスし日時を取得した上で、上の表に動的に追加されます。

4.bm_apl画面

データが追加された結果は、このページの最初の画面イメージの通りです。

補足

なお、Bluemixのサーバー上で稼働状況を確認したい場合は、Bluemixの3.bm_logB ボタンをクリックすることで確認できます。

EclipseのDevOpsサービスで作成した上のコードをGITに保存するには、左側にある以下の下のボタンでGIT環境に入ってください。そこで右の [作業ディレクトリーの変更] で [すべて選択] した上で [コミット] をクリックし 「コミット・メッセージの入力」 をした上でコミットしてください。GITに保存しておくと、バージョン管理や他の環境とのコードの共有が可能になります。
2.Bluemix_icon

 

⇒次は、Node.jsで動く Cloudantサンプル

 

 

nikami.org – デジタル時代の自分デジタル化の軌跡