Web/Node.js

2024-05-10 mongoose

nomad06 2024. 5. 10. 09:03

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

https://mongoosejs.com/

 

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

 

// 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', {virtusls:true});
    schema.set('toObject', {virtusls: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());  // 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);
 
// 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);   //자동으로 s붙여줌 USers 생성됨

// 아이디(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);
}

// export async function login(username){
//     return users.find((users) => users.username === username);
// }

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

 

// 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);

// 아이디(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);
}

// export async function login(username){
//     return users.find((users) => users.username === username);
// }

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

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

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

useVirtualId(tweetSchema);

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

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

// 해당 아이디에 대한 트윗을 리턴
export async function getAllByUsername(username){
    return Tweet.find({username}).sort({createAt: -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());
}
Creat 먼저 실행

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

// 트윗을 삭제
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;
}

 

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

2024-05-09 MongoDB  (0) 2024.05.09
2024-05-09 ORM, sequelize, MongoDB  (0) 2024.05.09
2024-05-08 DB  (0) 2024.05.08
2024-05-07 관리자페이지팁,  (0) 2024.05.07
2024-05-03 환경 변수 관리, HTTP 통신, 웹소켓  (0) 2024.05.03