본문 바로가기
Web/Node.js

19. Mongoose

by 사라리24 2024. 5. 10.
SMALL

1. Mongoose

  - Node.js와 MongoDB를 위한 ODM(Object Data Mapping) 라이브러리
 - Javascript Object와 MongoDB의 데이터를 Mapping하여 호환성을 만들어내고, 간편한 CRUD를 가능하게 한다.

 

  • branch 이동/확인
  
       git  switch mongodb
 
       git branch 
  



 

  • Mongoose 설치
  
      npm i mongoose
 
 

 

2. Mongoose로 DB연결하기

 

 

  • db > database.js
 
      < database.js  >

 
            import { config } from '../config.js';
            //import MongoDb from 'mongodb'; //삭제
            import Mongoose from 'mongoose'; //추가

            let db;

            //export async function connectDB(){
            //    console.log(config.db.host);
            //    return MongoDb.MongoClient.connect(config.db.host).then((client) => db = client.db());
            //}

            export async function connectDB(){
                return Mongoose.connect(config.db.host);
            }

            export function getUsers(){
                return db.collection('users');
            }

            export function getTweets(){
                return db.collection('tweets');
            }
 

 

  • app.js
 
      < js >

            import express from "express";
            import morgan from "morgan";
            import tweetsRouter from './router/tweets.js';
            import authRouter from './router/auth.js';
            import { config } from "./config.js";
            import { connectDB } from "./db/database.js";

            const app = express();

            app.use(express.json());
            app.use(morgan("dev"));

            app.use('/tweets', tweetsRouter);  
            app.use('/auth', authRouter);

            app.use((req, res, next) => {
                res.sendStatus(404);
            });

            //DB 연결 테스트

            //1.
            //db.getConnection().then(connection => console.log(connection)); //추가

            //2.
            // sequelize.sync().then(()=>{
            //     app.listen(config.host.port);
            // })

            //3.
            //connectDB().then((db) => {
            //    console.log('몽고DB 연결 성공!')
            //    app.listen(config.host.port);
            //}).catch(console.error);

            //4.
            connectDB().then((db) => {
                console.log('몽구스를 사용하여 몽고디비에 접속성공')
                app.listen(config.host.port);
            }).catch(console.error);

       </js >
  

 

  • 연결확인
  
      npm start
  
 

 

3. Mongoose로 회원가입, 로그인

 

 

  • db > database.js
 
 
      < db > database.js >
 
 
            import { config } from '../config.js';
            import Mongoose from 'mongoose'; // 추가


           // 추가
            export async function connectDB(){
                return Mongoose.connect(config.db.host);
            }
 
           // 추가
            export function useVirtualId(schema){
                schema.virtual('id').get(function(){
                    return this._id.toString();
                });
                schema.set('toJSN'),{virtuals:true};
                schema.set('toObject', {virtuals:true});
            }

            let db;

            export function getUsers(){
                return db.collection('users');
            }

            export function getTweets(){
                return db.collection('tweets');
            }
 
 
  

 

 

  • data> auth.js
  
      <  data> auth.js  >

            //import MongoDB from 'mongodb';
            import Mongoose from 'mongoose';
            import { getUsers, useVirtualId } from '../db/database.js';

            //const ObjectID = MongoDB.ObjectId;

            const userSchema = new Mongoose.Schema({
                username: {type: String, require: true},
                name: {type: String, require: true},
                email: {type: String, require: true},
                password: {type: String, require: true},
                url: String
            })

            useVirtualId(userSchema);
            const User = Mongoose.model('User', userSchema)


            // 아이디(username) 중복검사
            export async function findByUsername(username){
                return User.findOne({username});
            }

            // id 중복검사
            export async function findById(id){
                return User.findById(id);
            }

            // 회원가입
            export async function createUser(user){
                return new User(user).save().then((data)=> data.id);
            }


            function mapOptionalUser(user){
                return user ? { ...user, id: user._id.toString() } : user;
            }
  
 

 

 

  • postman 확인

회원가입

 

로그인 성공

 

 

  • MongoDB에서 확인

 

 


   - 참고하여 코드 작성!

 

Mongoose ODM v8.3.4

Let's face it, writing MongoDB validation, casting and business logic boilerplate is a drag. That's why we wrote Mongoose. const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/test'); const Cat = mongoose.model('Cat', { name:

mongoosejs.com

 


 

 

4. Mongoose로 
     Tweet  검색, 생성, 변경, 삭제

 

 

 

  • data   >  tweet.js
  
      < data   >  tweet.js  >

 
  
            //import MongoDB from 'mongodb';
            // import { getTweets, getUsers } from '../db/database.js';
            //import { Timestamp } from 'mongodb';
            import Mongoose from 'mongoose';
            import { useVirtualId } from '../db/database.js';
            import * as authRepository from './auth.js';

            //const ObjectID = MongoDB.ObjectId;


            const tweetSchema = new Mongoose.Schema({
                text: {type: String, require: true},
                userId: {type: String, require: true},
                name: {type: String, require: true},
                username: {type: String, required: true},
                url: String
            }, {timestamps: true});



            useVirtualId(tweetSchema);
            const Tweet = Mongoose.model('Tweet', tweetSchema);

            // 모든 트윗을 리턴(4)
            export async function getAll() {
                return Tweet.find().sort({createdAt: -1});
            }


            // 해당 아이디에 대한 트윗을 리턴(4)
            export async function getAllByUsername(username){
                return Tweet.find({username}).sort({createdAt: -1});
            }


            // 글번호에 대한 트윗을 리턴(4)
            export async function getById(id){
                return Tweet.findById(id);
            }


            // 트윗을 작성(4)
            export async function create(text, userId){
                return authRepository.findById(userId).then((user) => new Tweet({
                    text, userId, name: user.name, username: user.username, url: user.url
                }).save())
            }


            // 트윗을 변경(4)
            export async function update(id, text){
                return Tweet.findByIdAndUpdate(id, {text}, {returnDocument: "after"});
            }


            // 트윗을 삭제(4)
            export async function remove(id){
                return Tweet.findByIdAndDelete(id);
            }


            function mapTweets(tweets){
                return tweets.map(mapOptionalTweet);
            }

            function mapOptionalTweet(tweet){
                return tweet ? { ...tweet, id: tweet.insertedId } : tweet;
            }
 

 

 

 

 

  • postman 확인

 

 

 

 

 

 

  • MongoDB 확인

 

 

 

 

 

 

 

'Web > Node.js' 카테고리의 다른 글

18. MongoDB  (0) 2024.05.09
17. Sequelize  (0) 2024.05.08
16. ORM  (0) 2024.05.03
15. 환경변수, 웹소켓  (0) 2024.05.03
14. Postman 정리, 아이디 중복체크  (0) 2024.05.02