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