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 document 사이트: 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
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 |