掲示板をつくる【Node.js】処理を書きます!
今回は掲示板のプログラム本体を書いていきます。
先にコードを見ていきます。
今回は「index.ejs」と「app.js」を使っています。
役割はクライアント側とサーバ側となります。
index.ejs
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
<title>掲示板</title>
</head>
<body>
<nav class="navbar navbar-dark bg-primary mb-2">
<a href="#" class="navbar-brand">掲示板</a>
</nav>
<div class="container">
<form action="/" method="POST">
<div class="form-group">
<label for="text1">メッセージ:</label>
<input type="text" id="message" name="message" class="form-control" autofocus>
</div>
<div class="form-group">
<button type="submit" class="btn btn-block btn-outline-success">送信</button>
</div>
</form>
<ul class="list-group">
<% message_list.forEach(function (value, key) { %>
<li class="list-group-item"><%= value %></li>
<% }); %>
</ul>
</div>
</body>
</html>基本的に前回のモックと同じようなものです。
変更点1
inputタグに「autofocus」属性が追加されています。
この属性を付けると表示したときにフォーカスを当ててくれます。
同じくinputタグには「name」属性を追加しました。
変更点2
buttonタグのtypeを「submit」にしました。
変更点3
サーバ側から渡された配列をリスト表示する処理を追加しました。
この教材の目玉とも言える部分です。覚えていってね。
<ul class="list-group">
<% message_list.forEach(function (value, key) { %>
<li class="list-group-item"><%= value %></li> <% }); %>
</ul>
サーバ側からは「message_list」というリストを渡しています。
リストの要素を、それぞれ<li>タグで表示する処理です。
いろいろ触って実行してみると意味が分かるはずです。
app.js
var express = require('express');
var fs = require('fs');
var app = express();
var bodyParser = require('body-parser');
// EJS設定
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({
extended: true
}));
app.get('/', function (req, res) {
let array = getData();
res.render('index', {message_list: array});
});
app.post('/', function (req, res) {
let array = getData();
if (req.body.message.length > 0) {
array.push(req.body.message);
fs.writeFileSync("data.txt", array.join("\r\n"));
}
res.render('index', {message_list: array});
})
function getData() {
let data = fs.readFileSync("data.txt", {encoding: "utf-8"});
var array = [];
if (data.length > 0) {
array = data.split(/\r\n|\r|\n/);
}
return array;
}
app.listen(3000, function () {
});サーバ側はファイル読み書きの時から拡張されています。
変更点1
bodyParserというモジュールを追加しました。
これの役割はPOSTされたデータを取得するものです。
入力されたメッセージはボタンを押すとPOSTされてきます。
method="POST"と「index.ejs」にも書いてあります。
変更点2
app.postという定義が追加されています。
前述の通り、POSTされた場合に呼び出されます。
ファイルに追記する処理が実装されています。
実行結果



VSCodeだとテキストファイルもリアルタイムに確認できます。

まとめ
ファイルの読み書きについては、これで一旦終了です。
実際のシステムではデータベースを使うケースが多いですが、簡単なシステムの場合はファイルが利用されることもあります。大規模なシステムだパフォーマンスが問題になってくるかもです。
余裕のある方は、送信したデータの削除などにチャレンジしてみるのもいいですね。




