*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*
1. Mongoose
- Node.js와 MongoDB를 위한 ODM(Object Data Mapping) 라이브러리
- Javascript Object와 MongoDB의 데이터를 Mapping하여 호환성을 만들어내고, 간편한 CRUD를 가능
몽구스를 사용하는 이유: 몽고db를 사용하는 것보다, 지원하는 메서드가 많아서 데이터처리가 많다. schema를 생성할 수 있어서, 속도가 빠름, schema가 데이터가 들어가는 규격 생성-> 몽고db에 schema 적용
궁극적으로 schema틀 만들고 모듈적용하기
// mongoose 설치하기
npm i mongoose
auth폴더를 postman으로 미들웨어 요청방식이 작동하는지 확인하기:
// db > database.js 파일
import { config } from '../config.js';
import Mongoose from 'mongoose';
let db;
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});
}
export function getUsers(){
return db.collection('users');
}
export function getTweets(){
return db.collection('tweets');
}
// 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);
// const ObjectID = MongoDB.ObjectId;
// 아이디(username) 중복검사
export async function findByUsername(username){
return User.findOne({username});
}
// id 중복검사
export async function findById(id){
return User.findById(id);
}
// user객체 생성
export async function createUser(user){
return new User(user).save().then((data)=> data.id);
}
// export async function login(username){
// const user = users.find((user) => user.username === username)
// return user;
// }
function mapOptionalUser(user){
return user ? { ...user, id: user._id.toString() } : user;
}
// 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);
postman에서 tweets폴더로 DB를 새로 생성합니다.
// data > tweet.js 파일
import Mongoose from 'mongoose';
import { useVirtualId } from '../db/database.js';
import * as authRepository from './auth.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);
}
'JavaScript > Node JS' 카테고리의 다른 글
Java Script(17)-Sequelize, MongoDB (0) | 2024.05.09 |
---|---|
Java Script(16)-MySQL DBMS node.js연동 (0) | 2024.05.08 |
Java Script(12)-Refactoring(리팩토링), validate(데이터 검증) (0) | 2024.04.29 |
Java Script(11)-미들웨어 요청방식 실습: tweets (0) | 2024.04.26 |
Java Script(10)-route메서드, morgan (0) | 2024.04.25 |