๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[CRUD์„ ์ด์šฉํ•œ File upload Web] (10) user ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ๋ฐฑ์—”๋“œ(Back-End)/Node js

[CRUD์„ ์ด์šฉํ•œ File upload Web] (10) user ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ

์ง•์ง•์•ŒํŒŒ์นด 2023. 3. 11. 21:32
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” DCodeMania ์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ :-)>

=> CRUD App With Image Upload Using NodeJs, ExpressJs, MongoDB & EJS Templating Engine

 

 

๐Ÿฅ• user ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ

 

๐Ÿง routes/routes.js

const express = require("express");
const router = express.Router();
const User = require("../models/user");
const multer = require("multer");
const fs = require("fs");
const { resourceLimits } = require("worker_threads");

// image upload
var storage = multer.diskStorage({
  // ํŒŒ์ผ์ด ์—…๋กœ๋“œ๋  ๊ฒฝ๋กœ ์„ค์ •
  destination: function (req, file, cb) {
    cb(null, "./uploads");
  },
  // timestamp๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ํŒŒ์ผ๋ช… ์„ค์ •
  filename: function (req, file, cb) {
    cb(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);
  }
})

var upload = multer({
  storage: storage,
}).single("image");   // ํ•œ ๊ฐœ์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ

// Insert an user into database route
router.post("/add", upload, (req, res) => {
  const user = new User({
    name: req.body.name,
    email: req.body.email,
    phone: req.body.phone,
    image: req.file.filename,
  });

  user.save().then((err) => {
    // index.js ์— res.locals.message ์žˆ์Œ
    req.session.message = {
      type: "success",
      message: "User added successsfull!"
    };
    // ์ง€์ •๋œ ๋‹ค๋ฅธ URL๋กœ ์žฌ์š”์ฒญ (ํ™ˆ)
    res.redirect("/");
  }).catch((err) => {
    res.json({ message: err.message, type: "danger" });
  })
});

// 1) Get all users route
router.get("/", async (req, res) => {
  const user = await User.find();

  try {
    // Query๋ฅผ ์ด์šฉํ•  ๋•Œ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฆฌํ„ด๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด exec() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉ
    // find()๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Query์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ด
    res.render("index", {
      title: "Home Page",
      // ๊ถ๊ธˆ : ๋„ˆ ์™œ error ์žกํžˆ๋‹ˆ?
      users: user
    });
  } catch (error) {
    (error) => {
      res.json({ message: error.message });
    }
  };
});

router.get("/add", (req, res) => {
  res.render("addUsers", { title: "Add users" });
})

// 2) Edit an user routes
router.get("/edit/:id", async (req, res) => {
  let id = req.params.id;
  const user = await User.findById(id);

  try {
    if (user == null) {
      res.redirect("/");
    } else {
      res.render("editUsers", {
        title: "Edit User",
        user: user,
      });
    }
  } catch (err) {
    res.redirect("/");
  }
});

// 3) Update user route
router.post("/update/:id", upload, async (req, res) => {
  let id = req.params.id;
  let new_image = "";

  if (req.file) {
    new_image = req.file.filename;
    try {
      // ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ ์ •๋ณด ์ฝ๊ธฐ
      fs.readFileSync("./uploads/" + req.body.old_image);
    } catch (err) {
      console.log(err);
    }
  } else {
    req.image = req.body.old_image;
  }

  //  ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ์—…๋ฐ์ดํŠธ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์„œ์˜ id, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์—…๋ฐ์ดํŠธ ํ•  ์ •๋ณด ํ˜น์€ ๋‚ด์šฉ
  const user = await User.findByIdAndUpdate(id, {
    name: req.body.name,
    email: req.body.email,
    phone: req.body.phone,
    image: new_image
  });

  try {
    req.session.message = {
      type: "success",
      message: "User updated successfully!",
    };
    res.redirect("/");
  } catch (err) {
    res.json({ message: err.message, type: "danger" });
  }
});

// 4) Delete user route
router.get("/delete/:id", async (req, res) => {
  let id = req.params.id;
  // id ๋ฅผ ์ฐพ์•„์„œ ์ง€์›€
  await User.findByIdAndRemove(id);

  try {
    req.session.message = {
      type: "info",
      message: "User deleted successfully!"
    };
    res.redirect("/");
  } catch (err) {
    res.json({ message: err.message });
  }
});

module.exports = router;

 

๐Ÿง views/editUser.ejs

<%- include("layout/header") %>

  <div class="container">
    <div class="row">
      <div class="col-lg-6 mx-auto mt-4">
        <div class="card shadow">
          <div class="card-header bg-success">
            <h3 class="text-light">Edit User (<%= user.name %>)</h3>
          </div>
          <div class="card-body p-4">
            <!-- add๋ž‘ router ๊ฒฝ๋กœ ๊ฐ™์•„์•ผ ๋ ๋“ฏ? -->
            <form action="/update/<%= user._id %>" method="post" id="add-form" enctype="multipart/form-data">
              <div class="mb-3">
                <label for="name">Name</label>
                <input type="text" name="name" class="form-control form-control-lg" placeholder="Enter name"
                  value="<%= user.name %>" required />
              </div>
              <div class="mb-3">
                <label for="email">Email</label>
                <input type="email" name="email" class="form-control form-control-lg" placeholder="Enter email"
                  value="<%= user.email %>" required />
              </div>
              <div class="mb-3">
                <label for="phone">Phone</label>
                <input type="tel" name="phone" class="form-control form-control-lg" placeholder="Enter phone"
                  value="<%= user.phone %>" required />
              </div>
              <div class="mb-3">
                <label for="image" class="form-label">Select Image</label>
                <input type="file" name="image" class="form-control form-control-lg" />
                <img src="/<%= user.image %>" width="100" class="img-thumbnail mt-1">
              </div>
              <input type="hidden" name="old_image" value="<%= user.image %>">
              <div class="mb-3 d-grid">
                <input type="submit" name="submit" value="Update User" class="btn btn-success btn-lg" />
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
  </div>

  <%- include("layout/footer") %>

 

์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•œํ›„์— ๋นจ๊ฐ„ ์“ฐ๋ ˆ๊ธฐํ†ต์„ ๋ˆŒ๋Ÿฌ ์‚ญ์ œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค~~~~~~~~~~ delete!

 

728x90
๋ฐ˜์‘ํ˜•
Comments