본문 바로가기

Nodejs

Mongoose (2024-05-10)

 

 

Mongoose

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

 

 

 

data > auth.js

더보기
import Mongoose from 'mongoose';
import { useVirtualId } from '../db/database.js';

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) // Users 컬렉션에 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); // User객체 생성 하고 입력받은 user객체 값을 넣고 저장
};

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

 

 

data > tweet.js

더보기
import Mongoose from 'mongoose';
import * as authRepository from './auth.js';
import { useVirtualId } from '../db/database.js';

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

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


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

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

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


// 트윗을 작성
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())
}

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

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

 

 

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(){ // 스키마에 id를 추가하고
        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');
}

 

 

app.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 연결 테스트!
connectDB().then((db) =>{
    console.log('몽구스를 사용하여 몽고디비에 접속')
    app.listen(config.host.port)
}).catch(console.error);

'Nodejs' 카테고리의 다른 글

MongoDB (2024-05-09)  (0) 2024.05.10
tweet, auth DB연결 (2024-05-08)  (0) 2024.05.08
Authentication (2024-05-02)  (0) 2024.05.02
과제 회원가입, 로그인 router, tweet 활용  (0) 2024.04.29
리팩토링, validation(2024-04-29)  (0) 2024.04.29