Node.js : REST API 만드는 방법 2부

36000 단어 expressnodemongodbapi
안녕하세요 커뮤니티,

이 부분에서 확인할 수 있는 첫 번째 부분이 보이지 않으면 REST API를 완료합니다.

시작하자



우리가 다룰 이 부분 전체:
  • 새 동영상 만들기
  • id로 동영상 가져오기
  • 모든 동영상 가져오기
  • 동영상 업데이트
  • 동영상 삭제
  • 마지막으로 미들웨어 개념과 이를 API에서 구축하고 구현하는 방법
  • 에 대해 이야기하겠습니다.

    먼저 영화 모델을 만들어야 하므로 models 폴더에 movie-model.js라는 파일을 만듭니다.

    //movie-model.js
    const mongoose = require('mongoose');
    
    const Schema = mongoose.Schema;
    
    const userSchema = new Schema({
      title: { type: String, required: true },
      description: { type: String, required: true},
      creator: { type: String, required: true }
    });
    
    module.exports = mongoose.model('Movie', userSchema);
    


    이제 우리는 movie-controller.js 파일을 생성하는 controllers 폴더에 무비 컨트롤러를 생성할 시간입니다.

    //movie-controller.js
    const { validationResult } = require('express-validator');
    const ObjectId = require('mongoose').Types.ObjectId;
    const User = require('../models/user-model');
    const Movie = require('../models/movie-model');
    
    // CREATE MOVIE 
    const createMovie = async (req, res) => {};
    
    // GET MOVIE BY ID 
    const getMovieById = async (req, res) => {};
    
    // GET ALL MOVIES 
    const getAllMovies = async (req, res) => {};
    
    // UPDATE MOVIE 
    const updateMovie = async (req, res) => {};
    
    // DELETE MOVIE 
    const deleteMovie = async (req, res) => {};
    
    module.exports = {
        createMovie,
        getMovieById,
        getAllMovies,
        updateMovie,
        deleteMovie
    };
    


    나중에 이러한 기능을 하나씩 사용할 것이라고 걱정하지 마십시오. 이제 route 폴더에 생성한 영화 경로movie-routes.js를 설정해야 합니다.

    //movie-routes.js
    const { check } = require('express-validator');
    const movieController = require('../controllers/movie-controller');
    const express = require('express');
    const router = express.Router();
    
    const {
        createMovie,
        getMovieById,
        getAllMovies,
        updateMovie,
        deleteMovie } = movieController;
    
    const validation = [ 
        check('title').not().isEmpty(),
         check('description').not().isEmpty(),
         check('creator').not().isEmpty()]
    
    // CREATE MOVIE 
    router.post('/',validation,createMovie);
    
    // GET MOVIE BY ID 
    router.get('/:id',getMovieById);
    
    // GET ALL MOVIES
    router.get('/',getAllMovies);
    
    // UPDATE MOVIE 
    router.patch('/:id',validation,updateMovie);
    
    // DELETE MOVIE 
    router.delete('/:id',deleteMovie);
    
    module.exports = router;
    

    movie-controller.js 함수에 들어가기 전에 마지막으로 해야 할 일은 movie-routes 파일에 index.js를 추가하는 것입니다.

    //index.js
    const movieRoutes = require('./routes/movie-routes'); 
    
    app.use('/api/movie', movieRoutes);
    


    이제 첫 번째 함수createMovie부터 시작하겠습니다.

    // CREATE MOVIE 
    const createMovie = async (req, res) => {
    
          const errors = validationResult(req);
          if (!errors.isEmpty()) 
             return res.status(400).json({ errors: errors.array() });
    
          const { title, description, creator } = req.body;
          let  existingUser = await User.findOne({ _id: creator });
          if (!existingUser)
             return res.status(400).json({error : 'invalid user'});
    
          const movie = new Movie({
              title,
              description,
              creator
          });
    
          try {
              await movie.save();
              res.status(200).json({
              message: "movie created successfully",
              movie: movie
            })
          } catch (error) {
               res.status(500).json(error.message);
          }
    };
    


    로직을 먼저 설명하겠습니다. 일부 유효성 검사가 실패하면 데이터 유효성 검사 결과를 확인합니다. 그렇지 않으면 오류를 반환합니다. 그렇지 않으면 모든 데이터 제목, 설명 및 작성자 = 사용자 ID를 가져옵니다. 이 ID를 가진 사용자가 없으면 오류를 반환하고 마지막으로 생성합니다. 영화 개체를 데이터베이스에 저장한 다음 성공적으로 메시지가 포함된 json 개체와 생성된 영화를 반환합니다.
  • getMovieById :

  • // GET MOVIE BY ID 
    const getMovieById = async (req, res) => {
    
          const movieId = req.params.id;
          if(!ObjectId.isValid(movieId))
               return res.status(400).json({error : 'Invalid id'});
    
            try {
                const movie = await Movie.findById(movieId);
                if(!movie) 
                   return res.status(404).json('there is no movie with this id.');
                 res.status(200).json(movie)
            } catch (err) {
                 res.status(500).json({error:err.message});
            } 
    };
    


    논리는 간단합니다. 이 함수는 영화 ID를 매개변수로 가져오고 유효한 ID인지 확인한 다음 데이터베이스에서 검색하고 그렇지 않으면 해당 ID를 가진 영화가 없다는 메시지를 반환합니다.
  • getAllMovies :

  • // GET ALL MOVIES 
    const getAllMovies = async (req, res) => {
    
        try {
            const movies = await Movie.find();
            return res.status(200).json(movies)
        } catch (err) {
            return res.status(500).json({message :'server error'})
        }
    
    };
    


  • updateMovie :

  • // UPDATE MOVIE 
    const updateMovie = async (req, res) => {
    
        const errors = validationResult(req);
         if(!errors.isEmpty()) 
            return res.status(400).json({ errors: errors.array() });
    
        const { title, description, creator } = req.body;
        const movieId = req.params.id;
        if(!ObjectId.isValid(movieId))
               return res.status(400).json({error : 'Invalid id'});
    
         try {
             const movie = await Movie.findById(movieId);
             if(!movie)
                return res.status(404).json({message: 'movie not found.'});
             await movie.updateOne({
                 title,
                 description,
                 creator
             })
             return res.status(200).json(movie)
         } catch (err) {
             console.log(err.message);
             res.status(500).json({error : 'server error'});
    
         }
    };
    


  • deleteMovie :

  • //DELETE MOVIE 
    const deleteMovie = async (req, res) => {
    
        const movieId = req.params.id ; 
        if(!ObjectId.isValid(movieId))
               return res.status(400).json({error : 'Invalid id'});
    
        try {
            const movie = await Movie.findById(movieId);
            if(!movie) 
               return res.status(404).json({message : 'there is no movie with this id.'});
    
            await movie.remove();
            res.status(200).json({message : 'movie removed'});
        } catch (err) {
            console.log(err.message);
            res.status(500).json({error : 'server error'});
        }
    
    };
    


    이제 API 경로 중 일부를 보호하기 위해 인증 미들웨어를 구축해야 합니다. API에서는 누구나 인증 없이 영화를 추가, 업데이트 및 삭제할 수 있기 때문에 이는 좋지 않습니다.

    미들웨어 기능은 요청 개체(req), 응답 개체(res) 및 애플리케이션의 요청-응답 주기에서 다음 미들웨어 기능에 액세스할 수 있는 기능입니다. next 미들웨어 기능은 일반적으로 next라는 변수로 표시됩니다.

    미들웨어 폴더에 auth.js라는 파일을 만듭니다.

    const jwt = require('jsonwebtoken');
    
    module.exports = function(req, res, next){
    
        const token = req.header('x-auth-token');
        if(!token) 
           return res.status(401).json({ message: 'No token, authorization dnied.'});
        try{
            const decoded = jwt.verify(token,'supersecretkey');
            req.user = decoded.user;
            next();
        }catch(err){
            res.status(401).json({ message: 'Token is not valid' });
        }
    }
    


    내가 설명하자 :
    사용자가 로그인하거나 등록할 때 API는 토큰을 반환합니다. 이 토큰은 사용자가 인증되었음을 나타내지만 이를 사용하려면 헤더에 'x-auth-token'으로 추가해야 합니다. 영화 인증 메들웨어는 헤더에서 이 토큰을 가져오고 유효한 토큰인지 테스트한 다음 영화를 추가할 수 있습니다. 그렇지 않으면 미들웨어가 토큰이 유효하지 않다는 오류를 반환합니다.

    API를 보호하려면 movie-routes.js에서 auth 미들웨어를 가져와 보호하려는 모든 경로에서 두 번째 인수로 추가하기만 하면 됩니다.

    //movie-routes.js
    // CREATE MOVIE 
    router.post('/',[auth, validation],createMovie);
    
    // UPDATE MOVIE 
    router.patch('/:id',[auth, validation],updateMovie);
    
    // DELETE MOVIE 
    router.delete('/:id',auth, deleteMovie);
    


    'auth.js'를 가져오는 것을 잊지 마세요.

    Postman을 사용하여 REST API를 테스트해 보겠습니다.
  • 먼저 인증해야 합니다.
  • 헤더에 토큰을 추가하지 않고 새 동영상을 추가합니다.
  • 헤더에 토큰이 있는 새 영화를 추가합니다(토큰을 복사하고 헤더로 이동하여 새 키 'x-auth-token'을 추가하고 토큰을 값으로 넣습니다).
  • id로 동영상 가져오기
  • 모든 영화 받기
  • 동영상 업데이트
  • 동영상 삭제

  • 이제 API가 완료되었다고 말할 수 있습니다. 자체 REST API를 구축할 때 필요한 모든 기본 사항과 규칙을 다룹니다.

    감사합니다.

    좋은 웹페이지 즐겨찾기