Skip to content

Commit bf4a0e7

Browse files
committed
データベースの章をFetch API中心に書き換え
1 parent 59a41a1 commit bf4a0e7

File tree

4 files changed

+85
-79
lines changed

4 files changed

+85
-79
lines changed

docs/3-web-servers/08-database/_samples/forum/main.mjs

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,19 @@ import express from "express";
22
import { PrismaClient } from "./generated/prisma/index.js";
33

44
const app = express();
5-
app.use(express.urlencoded({ extended: true }));
65
const client = new PrismaClient();
76

8-
app.get("/", async (request, response) => {
7+
app.use(express.json());
8+
app.use(express.static("./public"));
9+
10+
app.get("/posts", async (request, response) => {
911
const posts = await client.post.findMany();
10-
response.send(`
11-
<!doctype html>
12-
<html lang="ja">
13-
<head>
14-
<meta charset="utf-8" />
15-
<title>掲示板</title>
16-
</head>
17-
<body>
18-
<ul>
19-
${posts.map((post) => `<li>${post.message}</li>`).join("")}
20-
</ul>
21-
<form method="post" action="/send">
22-
<input placeholder="メッセージ" name="message" />
23-
<button type="submit">送信</button>
24-
</form>
25-
</body>
26-
</html>
27-
`);
12+
response.json(posts);
2813
});
2914

3015
app.post("/send", async (request, response) => {
3116
await client.post.create({ data: { message: request.body.message } });
32-
response.redirect("/");
17+
response.send();
3318
});
3419

3520
app.listen(3000);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!doctype html>
2+
<html lang="ja">
3+
<head>
4+
<meta charset="utf-8" />
5+
<title>掲示板</title>
6+
</head>
7+
<body>
8+
<ul id="message-list"></ul>
9+
<input id="message-input" placeholder="メッセージ" />
10+
<button id="send-button" type="button">送信</button>
11+
<script type="module" src="./script.mjs"></script>
12+
</body>
13+
</html>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
setInterval(async () => {
2+
const response = await fetch("/posts");
3+
const posts = await response.json();
4+
5+
const messageList = document.getElementById("message-list");
6+
messageList.innerHTML = "";
7+
8+
for (const post of posts) {
9+
const li = document.createElement("li");
10+
li.textContent = post.message;
11+
messageList.appendChild(li);
12+
}
13+
}, 1000);
14+
15+
document.getElementById("send-button").onclick = async () => {
16+
const message = document.getElementById("message-input").value;
17+
await fetch("/send", {
18+
method: "post",
19+
headers: { "Content-Type": "application/json" },
20+
body: JSON.stringify({ message: message }),
21+
});
22+
};

docs/3-web-servers/08-database/index.mdx

Lines changed: 44 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,6 @@ model Post {
269269

270270
Node.jsのデバッガを用いて、データベースのデータがPrismaで取得できることを確認しましょう。
271271

272-
### 手順6
273-
274-
Expressをインストールし、`/`へのGETリクエストに対して、データベースのデータをHTMLに整形したレスポンスを返せるようにしましょう。
275-
276272
:::info[ヒント]
277273
Prismaの`findMany`メソッドを用いて、テーブル内にある全てのレコードを取得できます。
278274

@@ -284,76 +280,71 @@ const posts = await client.post.findMany();
284280
// ]
285281
```
286282

287-
このメソッドの戻り値は、各カラムの値をプロパティとして持つオブジェクトの配列です。`Array#map`メソッドや`Array#join`メソッドを用い、適切なHTMLに変換してレスポンスを生成しましょう。
283+
このメソッドの戻り値は、各カラムの値をプロパティとして持つオブジェクトの配列です。
288284
:::
289285

286+
### 手順6
287+
288+
Expressをインストールし、`/posts`へのGETリクエストに対して、データベースのデータをJSON形式のレスポンスで返せるようにしましょう。
289+
290290
<Answer title="手順6まで">
291291

292-
```javascript title="main.mjsの抜粋"
293-
app.get("/", async (request, response) => {
292+
```javascript title="main.mjsの抜粋 (サーバーとして動作するJavaScript)"
293+
app.get("/posts", async (request, response) => {
294294
const posts = await client.post.findMany();
295-
response.send(`
296-
<!doctype html>
297-
<html lang="ja">
298-
<head>
299-
<meta charset="utf-8" />
300-
<title>掲示板</title>
301-
</head>
302-
<body>
303-
<ul>
304-
${posts.map((post) => `<li>${post.message}</li>`).join("")}
305-
</ul>
306-
</body>
307-
</html>
308-
`);
295+
response.json(posts);
309296
});
310297
```
311298

312299
</Answer>
313300

314301
### 手順7
315302

316-
掲示板を投稿するためのHTMLのフォームを表示できるようにしましょう。入力されたデータは`/send`へのPOSTリクエストとして送信されるようにしてみましょう。
317-
318-
:::info[ヒント]
319-
手順6で作成したテンプレートとなるHTMLファイルを編集し、フォームを追加しましょう。
320-
:::
303+
[Fetch APIによるデータの送信の章](/docs/web-servers/fetch-api-post/)の演習問題2と同様にして、ブラウザ側で、定期的に`/posts`にGETリクエストを発行し、受け取ったレスポンスに基づいてメッセージの一覧を表示するようにしてください。また、メッセージを入力し、送信ボタンを押すと、`/send`に対してPOSTリクエストでメッセージの内容を送信するようにしてください。
321304

322305
<Answer title="手順7まで">
323306

324-
```javascript title="main.mjsの抜粋"
325-
app.get("/", async (request, response) => {
326-
const posts = await client.post.findMany();
327-
response.send(`
328-
<!doctype html>
329-
<html lang="ja">
330-
<head>
331-
<meta charset="utf-8" />
332-
<title>掲示板</title>
333-
</head>
334-
<body>
335-
<ul>
336-
${posts.map((post) => `<li>${post.message}</li>`).join("")}
337-
</ul>
338-
<form method="post" action="/send">
339-
<input placeholder="メッセージ" name="message" />
340-
<button type="submit">送信</button>
341-
</form>
342-
</body>
343-
</html>
344-
`);
345-
});
307+
```html title="public/index.htmlの抜粋"
308+
<ul id="message-list"></ul>
309+
<input id="message-input" placeholder="メッセージ" />
310+
<button id="send-button" type="button">送信</button>
311+
<script type="module" src="./script.mjs"></script>
312+
```
313+
314+
```javascript title="public/script.mjs (ブラウザ上で動作するJavaScript)"
315+
setInterval(async () => {
316+
const response = await fetch("/posts");
317+
const posts = await response.json();
318+
319+
const messageList = document.getElementById("message-list");
320+
messageList.innerHTML = "";
321+
322+
for (const post of posts) {
323+
const li = document.createElement("li");
324+
li.textContent = post.message;
325+
messageList.appendChild(li);
326+
}
327+
}, 1000);
328+
329+
document.getElementById("send-button").onclick = async () => {
330+
const message = document.getElementById("message-input").value;
331+
await fetch("/send", {
332+
method: "post",
333+
headers: { "Content-Type": "application/json" },
334+
body: JSON.stringify({ message: message }),
335+
});
336+
};
346337
```
347338

348339
</Answer>
349340

350341
### 手順8
351342

352-
前の手順で作成したHTMLのフォームの送信先 (`/send`へのPOSTリクエスト) を作成しましょう。送られてきたデータが正しいか、Node.jsのデバッガを用いて確認してみましょう。
343+
メッセージの送信先 (`/send`へのPOSTリクエスト) を作成しましょう。送られてきたデータが正しいか、Node.jsのデバッガを用いて確認してみましょう。
353344

354345
<Answer title="手順8まで">
355346

356-
```javascript title="main.mjsの抜粋"
347+
```javascript title="main.mjsの抜粋 (サーバーとして動作するJavaScript)"
357348
app.use(express.urlencoded({ extended: true }));
358349
app.post("/send", async (request, response) => {
359350
debugger; // ここでrequestオブジェクトの中身を確認
@@ -364,20 +355,15 @@ app.post("/send", async (request, response) => {
364355

365356
### 手順9
366357

367-
送られてきたデータをデータベースに保存できるようにしましょう。データベースに投稿が保存された後、ブラウザは自動的に`/`に戻るようにしてみましょう。
368-
369-
:::info[ヒント]
370-
[GETリクエストとPOSTリクエストの章](/docs/web-servers/get-post/)で扱った`express.Response#redirect`メソッドが使えます。
371-
372-
:::
358+
送られてきたデータをデータベースに保存できるようにしましょう。
373359

374360
<Answer title="手順9まで">
375361

376-
```javascript title="main.mjsの抜粋"
362+
```javascript title="main.mjsの抜粋 (サーバーとして動作するJavaScript)"
377363
app.use(express.urlencoded({ extended: true }));
378364
app.post("/send", async (request, response) => {
379365
await client.post.create({ data: { message: request.body.message } });
380-
response.redirect("/");
366+
response.send();
381367
});
382368
```
383369

0 commit comments

Comments
 (0)