5단계: 모델 사용

5단계: 모델을 사용하여 데이터베이스에 저장하려는 문서(또는 레코드)를 생성(또는 업데이트 또는 삭제)합니다.

지금까지 준비할 네 단계를 완료했으며 이 단계를 수행할 준비를 합니다.

우리는 앱, Post 및 User에 대해 두 가지 모델을 설계했습니다. 데이터베이스가 성공적으로 연결되었는지 확인했습니다. 우리는 UserSchema 및 PostSchema를 작성했으며 어떤 속성이 고유해야 하는지, 기본값이 있는지, 필수 속성인지 아닌지 명시적으로 정의했습니다. 마지막으로 mongoose.model()를 사용하여 이러한 스키마의 모델을 만들었습니다.

이제 User 및 Post 모델을 마음대로 사용할 수 있으며 첫 번째 사용자를 만들 준비가 되었습니다. 그러나 먼저 앱에 몇 가지 구성을 만들고 사용자 및 게시물을 생성하기 위한 두 가지 양식을 만들어 보겠습니다.

// app.js

const path = require('path');
// set path to the views folder
app.set('views', __dirname + '/views')

// set path to the public folder
app.use(express.static(path.join(__dirname, 'public')));
// allows to parse the submitted data with the request in req.body
app.use(express.urlencoded({extended: true}))


프로젝트의 루트에 public 및 views 폴더를 만들고 views 폴더 안에 index.html 파일을 추가합니다.

<!-- views/index.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
    </head>
    <body>
        <div class="wrapper">
            <!-- 1 -->
            <!-- Create a form for creating users -->
            <!-- on submit it goes to /api/users/create/ -->
            <form action="/api/users/create/" method="POST">
                <h2>Create a New User</h2>
                <label for="username">Username</label>
                <input id="username" type="text" name="username" placeholder="Name"/>
                <label for="email">Email</label>
                <input id="email" type="text" name="email" placeholder="Email"/>
                <button type="submit">Create</button>
            </form>

            <!-- 2 -->
            <!-- Create a form for creating posts-->
            <!-- on submit it goes to /api/posts/create/ -->
            <form action="/api/posts/create/" method="POST">
                <h2>Create new posts</h2>
                <label for="title">Title</label>
                <input id="title" type="text" name="title" placeholder="Title (optinal)"/>
                <label for="content">Content</label>
                 <textarea id="content" type="text" col="25" rows="5"
                          name="content" placeholder="Content here" required>
                </textarea>
                <button type="submit">Create</button>
            </form>
        </div>
    </body>
</html>


이제 두 가지 형식이 있습니다.
1- 새 사용자를 만들기 위한 양식입니다. 제출하면 보유하고 있는 데이터와 함께 "/api/users/create/"경로로 이동합니다.
2- 새 게시물을 작성하기 위한 양식입니다. 제출할 때 보유하고 있는 데이터와 함께 "/api/posts/create/"경로로 이동합니다.

다음으로 해당 경로를 앱에 추가해야 합니다.

// app.js
app.post("/api/users/create/",  /*pass for now*/);
app.post("/api/posts/create/",  /*pass for now*/);


이제 app는 이 두 경로에 대해 알고 있지만 이전에 정의한 양식이 해당 경로로 데이터를 보낼 때 어떤 함수를 호출해야 하는지 아직 알지 못합니다. 이러한 기능을 컨트롤러라고 합니다.

컨트롤러를 정의합시다

프로젝트의 루트에 컨트롤러 폴더를 생성하고 여기에 userControllers.js 및 postControllers.js 파일을 추가합니다.

// contollers/userControllers.js
// get User model from ../models/User.js
const User = require('../models/User');

// our controller for creating new users
// or the function that gets called when the form 
// for creating new users is submitted
exports.createUser = (req, res)=>{
   // pass for now
}



// contollers/postControllers.js

// get Post model from ../models/Post.js
const Post = require('../models/Post');

// our controller for creating new posts
// or the function that gets called when the form 
// for creating new posts is submitted
exports.createPost = (req, res)=>{
     // pass for now
}


이제 app.js로 돌아가 정의한 경로에 대한 컨트롤러를 지정해 보겠습니다.

// app.js

// the root route will show our two forms in /views/index.js/
app.get('/', (req, res)=>{
    res.sendFile(__dirname + '/views/index.html');
});

// we need userControllers to access createUser()
const userControllers = require('./controllers/userControllers');

// we need postControllers to access createPost()
const postControllers = require('./controllers/postControllers');

// add a new route to call createUser() 
app.post("/api/users/create/", userControllers.createUser);
// add a new route to call createPost() 
app.post("/api/posts/create/", postControllers.createPost);


지금까지 우리는:
1- views/index.html에서 사용자 및 게시물을 생성하기 위한 두 가지 양식을 생성했으며, 두 가지 다른 경로로 이동하는 작업을 사용합니다.
2- 해당 경로를 앱에 추가했습니다.
3- 양식이 제출되고 app.post 메서드에 전달될 때 호출되는 함수/컨트롤러를 정의했습니다.

아직 실행하지 않은 경우 nodemon app를 실행하고 http://localhost:3000/으로 이동하면 두 가지 간단한 양식이 표시됩니다.

새 사용자 만들기
이제 재미있는 부분으로 이동하여 데이터베이스와 상호 작용을 시작하고 새 사용자를 생성해 보겠습니다.

//models/User.js
// the schema we defined in a previous step
const UserSchema = new Schema({
    // if username is not provided "Anonymous" will get saved 
   // to the database instead
    username: {
         type: String, 
         default:"Anonymous",
        },
    // email has to be unqiue and always present when creating new users   
    email: {
        type: String,
        required: true,
        unique: true
    }
});



// contollers/userControllers.js

// get User model from ../models/User.js
const User = require('../models/User');

exports.createUser = (req, res)=>{
   // 1
   const {username, email} = req.body;
   // 2
     // when the username is provided create a userObj with 
    // username and email properties
   // else create a userObj with just the email
     const userObj = username? { username: username, email: email}
                             : { email: email }
     // pass userObj to User
     const newUser = new User(userObj);
  // 3
  newUser.save()
         .then(user=>{
            res.json({msg:"newUser saved successfully", user:user})
         })
         .catch(err=>{
            console.log(err)
            res.json({msg:"Error has occured"})
         })
}


위의 UseSchema에서 우리는 새 사용자를 생성하기 위한 두 가지 속성인 사용자 이름과 이메일만 있다는 것을 알고 있습니다.

그리고 creatuser() 컨트롤러에서:
먼저 req.body 에서 사용자 이름과 이메일 속성을 가져옵니다.

const {username, email} = req.body;


양식 입력에 지정한 이름이기 때문에 사용자 이름과 이메일이라는 이름을 알고 있습니다.

...
<input id="username" type="text" name="username" placeholder="Name"/>
                <label for="email">Email</label>
                <input id="email" type="text" name="email" placeholder="Email"/>
...



둘째, User를 사용하여 양식과 함께 제출한 데이터로 User의 newUser 인스턴스를 생성합니다. 해당 데이터는 사용자 이름과 이메일 또는 이메일만 될 수 있습니다.

 const userObj = username? { username: username, email: email}
                         : { email: email }
     // pass the userObj to User
     const newUser = new User(userObj);


마지막으로 newUser 인스턴스를 데이터베이스에 저장하려고 합니다.

 newUser.save()
         .then(user=>{
            res.json({msg:"newUser saved successfully", user:user})
         })
         .catch(err=>{
            console.log(err)
          res.json({msg:"Error has occured"})
         });


여기서 newUser.save()를 사용하면 두 가지 일이 발생할 수 있습니다.newUser가 성공적으로 저장되고 msg:"newUser saved successfully"와 사용자 개체가 포함된 개체를 받습니다.
또는
일부 오류가 발생하고 msg:"Error has occurred"가 포함된 개체를 수신합니다.

이제 사용자 생성 양식을 사용하여 사용자 이름에 대한 firstUser, 이메일에 대한 [email protected] 및 이메일만 제공하여 익명의 사용자를 생성해 보겠습니다.

이제 데이터베이스의 사용자 컬렉션에 두 명의 사용자가 있어야 합니다.



이제 몇 가지 게시물을 작성해 보겠습니다.

참조
freeCodeCamp
the mongoosejs docs .
MDN
code.tutsplus

좋은 웹페이지 즐겨찾기