Ejs、Mysqlを使用したCRUDの実装


🪓Ejs、Mysqlを使用したCRUDの実装


ejsを使用してCRUDを実装する過程で,Ejs構文を学習する.


文章を読むのがおっくうな人は羽センターでソースコードを見ればいいです人です.

自動完了EJS


もしEjsが自動的に完成しなかったら、私は本当にやりたくありません.
こちらです。をダウンロードしてください

Topictableの作成


Egoingさん生活コードさんがCRUDを勉強している理由を見ていると、文字や内容を含むテーブルの名前はいつもTopicで命名されています.
これは重要な内容ではありません.そうしましょう.
create table Topics(
    id int auto_increment primary key,
    Title varchar(30) not null,
    Article varchar(100) not null,
    Created date not null
)

Mainページ(READ)

app.get("/main", (req, res) => {
  const query = "SELECT * from Topics";
  db.query(query, (err, result) => {
    err ? res.send(err) : res.render("main", { data: result });
  });
});
テーブル内のすべてのデータ.ejsに転送します.
  <body>
    <div class="btnBox">
      <button
        onclick="location.href = '/create'"
        class="w-50 mb-5 mt-2 btn btn-success"
      >
        글쓰기
      </button>
    </div>

    <table class="table TableBox">
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col">글 제목</th>
          <th scope="col">내용</th>
          <th scope="col">날짜</th>
          <th scope="col">수정/삭제</th>
        </tr>
      </thead>

      <tbody>
        <% data.forEach((el,index) => {%>
        <tr>
          <th scope="row"><%= index + 1%></th>
          <td><%= el.Title %></td>
          <td><%= el.Article %></td>
          <td><%= el.Created.toLocaleDateString() %></td>
          <td>
            <a class="btn btn-warning" href="/edit/<%= el.id %> ">수정/삭제</a>
          </td>
        </tr>
      </tbody>
      <% }) %>
    </table>
  </body>
</html>
bootstrap-Tableコピーを貼り付けただけ重要なのはこれではありません.
foreach文によるejseach(自動完了)からのデータの受信
リストに追加します.
大事なのは.
<a class="btn btn-warning" href="/edit/<%= el.id %> ">수정/삭제</a>
このようにhtmlの間にデータを置くことができます.反応器のように.ああ、そしてvscodeでは、自動的に完成していない、もっときれいに書いている人はいつも変です.
"/edit/<%= "el.id" %>"
このように閉じると、最初から最後までハードコーディングされ、自動的に異常を完了することはできません.

main.ejs



執筆実施(CREATE)


Create.ejs

<body>
    <form
      id="edit"
      style="height: 100vh"
      class="container d-flex flex-column justify-content-center"
      action="/create"
      method="post"
    >
      <h2 class="text-center">Create</h2>
      
      <div class="d-flex justify-content-center">
        <input name="Title" class="w-50 form-control text-center" type="text" />
      </div>
      
      <textarea name="Article" class="mt-4 text-center form-control" rows="8">/textarea>
     
      <div class="text-center mt-3">
        <button type="submit" class="btn btn-primary">글쓰기</button>
      </div>
      
    </form>
 </body>
POSTリクエストを/createに送信します.
app.post("/create", (req, res) => {
  const Title = req.body.Title;
  const Article = req.body.Article;
  const query = `
  insert into Topics(Title ,Article,Created)
  values(?,?,DATE_FORMAT(now(), '%Y-%m-%d'))`;
  
db.query(query, [Title, Article], (err, result) => {
      err ? res.send(err) : res.send('<script>location.href = "/main"</script>');
 });
});
body-parserはタイトルと文章を受信し、insert文を使用してTopics Tableに追加します.
db.これをqeuryの2番目のパラメータとして使用することに慣れていない場合、よく知られている変更形式はこのようになります.
  insert into Topics(Title ,Article,Created)
  values(${Title},${Article},DATE_FORMAT(now(), '%Y-%m-%d'))`;

修正の実装(UPDATE)

  const ID = req.params.id;
  const query = "select * from Topics where id = ?";
  db.query(query, ID, (err, result) => {
    if (err) {
      res.send(err);
    } else if (result == "") {
      res.send("찾으시는 페이지가 존재하지않습니다.");
    } else res.render("Edit", { id: ID, Data: result[0] });
  });
});
簡単にidをパラメータとして(/id/3)
見つかった文章をwhere文で返します.
結果値が[]<でない場合は、検索するページがありません.
  <form id="delete" action="/delete" method="post"></form>
    <form
      id="edit"
      style="height: 100vh"
      class="container d-flex flex-column justify-content-center"
      action="/edit"
      method="post"
    >
      <h2 class="text-center">
        <%= Data.Created.toLocaleDateString() + "에 작성됨"%>
      </h2>
      <input
        name="Title"
        class="text-center form-control"
        value="<%= Data.Title %> "
        type="text"
      />
      <input name="id" type="hidden" value="<%= Data.id %> " />
      <input name="id" form="delete" type="hidden" value="<%= Data.id %> " />
      <textarea name="Article" class="mt-4 text-center form-control" rows="8">
    <%= Data.Article %> 
    </textarea
      >
      <div class="text-center mt-3">
        <button type="submit" class="btn btn-warning">수정</button>
        <button type="submit" form="delete" class="btn m-3 btn-danger">
          삭제
        </button>
      </div>
    </form>
どれも差が少ないのでejs部分は説明する必要はありませんが、よく見ると
formは2つあります.この部分に気をつければいい
今から見れば、私はどうしてそんなにコードを書くのかと思います.面倒くさいので、乞食を作ったような気がします.

/edit postリクエスト処理

app.post("/edit", (req, res) => {
const Title = req.body.Title;
const Article = req.body.Article;
const ID = req.body.id;
const query = `
  update Topics set Title = ?, 
  Article = ?, 
  Created = DATE_FORMAT(now(), '%Y-%m-%d') where id = ? `;
db.query(query, [Title, Article, ID], (err, result) => {
  err ? console.log(err)
  : res.send('<script>location.href = "/main"</script>');
});
update文を使用して修正機能を実現しました.

完成の様子


https://github.com/leejw05/ejs-board/blob/master/README.md
(動画あり)
しかしCRUDにDがない理由は(Delete)
私の文章を見てついてくる人はいないと思いますが、もし誰かがいたら
Delete機能は自分で実現でき、ダメならGitをクローンして自分のものにすることができます.