@@ -269,10 +269,6 @@ model Post {
269269
270270Node.jsのデバッガを用いて、データベースのデータがPrismaで取得できることを確認しましょう。
271271
272- ### 手順6
273-
274- Expressをインストールし、` / ` へのGETリクエストに対して、データベースのデータをHTMLに整形したレスポンスを返せるようにしましょう。
275-
276272:::info[ ヒント]
277273Prismaの` 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) "
357348app .use (express .urlencoded ({ extended: true }));
358349app .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) "
377363app .use (express .urlencoded ({ extended: true }));
378364app .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