추가 단계: 게시물 작성

이 시리즈의 마지막 기사에서는 많은 작업을 수행했습니다.
1- 우리는 두 개의 다른 경로에 대한 작업과 함께 사용자와 게시물을 만들기 위한 두 가지 간단한 양식을 만들었습니다.
2- 이 경로를 앱에 추가했습니다.
3- 각 양식 제출의 각 경로에 대해 하나씩 두 가지 기능/컨트롤러를 정의했습니다.
4- createUser() 함수를 사용하여 req.body에서 사용자 이름과 이메일을 추출하고 해당 정보를 사용하여 새 사용자를 생성했습니다.
5- 두 명의 사용자를 만들어 데이터베이스에 저장했습니다. 하나는 사용자 이름이 "firstUser"이고 다른 하나는 "Anonymous"입니다.

이제 게시물을 만들어 데이터베이스에 저장할 차례입니다. 하지만 먼저 이전 단계에서 만든 PostSchema를 살펴보겠습니다.

// models/Post.js
const PostSchema = new Schema({
    title: String,   
    content: {
        type: String,
        required: true,
        trim: true,
        minlength: 5,
    },
    created_at: {
        type: Date,
        default: Date.now
    },
    author: {
        type: Schema.Types.ObjectId,
        ref: "User"
    }
});


여기서 가장 중요한 속성은 작성자와 콘텐츠입니다. 작성자와 콘텐츠를 제공하지 않으면 게시물을 작성할 수 없습니다.

우리는 작성자 속성이 Schema.Types.ObjectId 유형이라는 것을 알고 있습니다. 이는 게시물 작성자의 _id를 보유하고 있음을 의미합니다. 그리고 데이터베이스에 두 명의 사용자만 있으므로 선택할 수 있는 _id는 두 개뿐입니다.
User 모델을 사용하고 firstUser의 _id를 가져온 다음 해당 _id를 사용하여 첫 번째 게시물을 작성해 보겠습니다.

// contollers/postControllers.js

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

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

exports.createPost = async (req, res)=>{
    // grab the title and content
    const {title, content} = req.body;

    // fetch the first user with "firstUser" username
    const firstUser = await User.findOne({username:"firstUser"});

    // create a new instance of Post with 
    const newPost = new Post({
          title: title,
          content: content,
          author: firstUser._id
    });
    // save the post
    newPost.save()
           .then(post=>{
               res.json({msg:"newPost saved successfully", post:post})
        })
        .catch(err=>{
            console.log(err)
            res.json({msg:"An error has occured"})
        })

}


여기서 createPost() 함수에 대해 가장 먼저 주목해야 할 점은 async을 사용할 수 있도록 await을 만들어 데이터베이스에서 가져온 값을 나중에 사용할 수 있는 변수에 저장할 수 있다는 것입니다. 암호.

이 줄과 같이:

const firstUser = await User.findOne({username:"firstUser"});


여기서는 findOne() 메서드를 사용하여 사용자 이름이 "firstUser"인 데이터베이스의 첫 번째 사용자를 가져와 firstUser 변수에 저장했습니다.

Mongoose<Model>.fineOne()(또는 데이터베이스와 상호 작용하는 데 사용되는 다른 메서드)는 약속을 반환하므로 해결해야 합니다. 즉, then()catch() 메서드와 함께 사용해야 합니다.
await가 없으면 다음과 같이 createPost() 작성했을 것입니다.

...
  // Not async anymore
exports.createPost = (req, res)=>{
    const {title, content} = req.body;

    User.findOne({username:"firstUser"})
        .then(user=>{
           // 1
            const newPost = new Post({
                        title: title,
                        content: content,
                        author: user._id
                       });
           newPost.save()
                  .then(post=>{
                     res.json({msg:"newPost saved successfully", post:post})
        })
                .catch(err=>{
                   console.log(err)
                   res.json({msg:"An error has occured"})
        })
        })
        .catch(err=>{
          console.log(err)
        });
}


1- 두 번째 접근 방식은 데이터베이스에서 가져온 사용자가 then() 블록 내에서만 접근할 수 있다는 점입니다. 따라서 우리 코드에서 newPost 변수를 생성하고 내부에 저장User.fineOne.then(user=>{})을 중첩해야 했습니다. 가져온 사용자는 외부가 아니라 그곳에서 접근할 수 있기 때문입니다.

참고: async/await를 사용하는 것이 여기에서 두 가지 방법 중 가장 좋은 방법인지 확실하지 않지만 때로는 코드를 더 깊은 수준으로 중첩하는 대신 사용하고 싶습니다.

이제 "firstUser"에 대한 새 게시물을 만들 수 있습니다. 야이

http://localhost:3000/으로 이동하여 몇 개를 만듭니다.

Mongoose는 데이터베이스와 상호 작용하고 문서를 쉽게 생성, 가져오기, 업데이트 또는 삭제할 수 있도록 도와줍니다many methods and options.

내가 작업한 몇 가지 방법은 다음과 같습니다.

1- findOne(«selectors») : 전달된 선택자와 일치하는 첫 번째 문서를 가져오거나 일치하지 않는 경우 null 문서를 가져옵니다.

// returns the first user matched 
User.findOne({username:"Anonymous", email:"[email protected]"});


2- findById(«id») : 전달된 id로 객체를 찾습니다.

// return the user with the id userId
const { userId } = req.params
User.findById(userId)


3- find(«selectors») : 선택자와 일치하는 모든 문서의 배열을 반환하거나 일치하지 않는 경우 빈 배열을 반환합니다.

// returns an array of all the users with username "Anonymous"
User.find({username:"Anonymous"});

// returns all the users
User.find()


3- findOneAndDelete(«selectors») : 일치하는 문서를 찾아 제거하고 찾은 문서(있는 경우)를 콜백에 전달합니다.

// finds the user with the _id userId and deletes it
const { userId } = req.params
User.findOneAndDelete({_id:userId})


몇 가지 옵션:
1- limit(«Number») : 반환된 배열을 전달된 숫자로 제한합니다.

// returns an array of ten users with usename "Anonymous"
User.find({username:"Anonymous"})
    .limit(10)


2- sort(«Object|String») : 정렬 순서를 설정합니다. 그리고 개체가 전달되면 허용되는 값은 asc , desc , ascending , descending , 1-1 입니다.

// returns an array of ten users
// sorted by id
   User.find()
       .limit(10)                              
       .sort({_id:"asc", username:"desc"})
// Or .sort('_id -username') 


지금까지 Express와 Moongose를 함께 사용하는 방법에 대해 배운 것은 이것이 거의 전부라고 생각합니다. 그리고 저는 아직 배울 것이 더 많다고 생각합니다.

읽어 주셔서 감사합니다

참조
freeCodeCamp
the mongoosejs docs .
MDN
code.tutsplus

좋은 웹페이지 즐겨찾기