Node.js : REST API 만드는 방법 2부
이 부분에서 확인할 수 있는 첫 번째 부분이 보이지 않으면 REST 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를 테스트해 보겠습니다.
이제 API가 완료되었다고 말할 수 있습니다. 자체 REST API를 구축할 때 필요한 모든 기본 사항과 규칙을 다룹니다.
감사합니다.
Reference
이 문제에 관하여(Node.js : REST API 만드는 방법 2부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ridhamz/node-js-how-to-make-a-rest-api-part-2-38af텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)