프로젝트 생성
{
"name": "learn-mongoose",
"version": "1.0.0",
"description": "learn mongoose",
"main": "index.js",
"scripts": {
"start": "nodemon app",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "hvvan",
"license": "MIT",
"dependencies": {
"express": "^4.17.1",
"mongoose": "^5.11.17",
"morgan": "^1.10.0",
"nunjucks": "^3.2.3"
}
}
프로젝트를 하나 생성해 위와 같이 packge.json을 만들자.
그리고 아래 패키지를 설치하자.
npm i express morgan nunjucks mongoose
npm i -D nodemon
몽고디비 연결
노드와 몽고디비를 몽구스를 통해 연결해보자.
몽고디비는 주소를 사용해 연결한다. 주소 형식은 다음과 같다.
mongodb://[username:password@]host[:port][/[database][?options]]
우선 schemas 폴더를 루트 디렉토리에 생성한 뒤 index.js 파일을 만들자.
const mongoose = require('mongoose');
const dbConfig = require('../config/key')
const connect = () => {
if (process.env.NODE_ENV !== 'production'){
mongoose.set('debug', true)
}
mongoose.connect(dbConfig.MongoURI, {
dbName: 'nodejs',
useNewUrlParser: true,
useCreateIndex: true,
},(error) => {
if(error){
console.log('몽고디비 연결 에러', error)
}else{
console.log('몽고디비 연결 성공')
}
});
};
mongoose.connection.on('error', (err) => {
console.error('몽고디비 연결에러', err);
});
mongoose.connection.on('disconneted', () => {
console.error('몽고디비 연결이 끊겼습니다. 연결을 재시도합니다.',);
connet();
});
module.exports = connect;
app.js를 만들고 연결해보자.
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');
const connect = require('./schemas');
const app = express();
app.set('port', process.env.PORT || 3002);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});
connect();
app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use((req, res, next) => {
const err = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
err.status = 404;
next(err);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err: {};
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기중....');
});
모델 생성
이제 스키마를 정의해보자.
시퀄라이즈와 비슷하게 몽구스 스키마를 만드는 것이다.
const mongoose = require('mongoose');
const { Schema } = mongoose;
const userSchema = new Schema({
name: {
type: String,
required: true,
unique: true,
},
age: {
type: Number,
required: true,
},
married: {
type: Boolean,
required: true,
},
comment: String,
createdAt: {
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('User', userSchema);
schemas/user.js
const mongoose = require('mongoose');
const { Schema } = mongoose;
const { Types: {ObjectId} } = Schema;
const commentSchema = new Schema({
commenter: {
type: ObjectId,
required: true,
ref: 'User',
},
comment: {
type: String,
required: true,
},
createdAt: {
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('Comment', commentSchema);
schemas/comment.js
ref속성 값이 User로 주어졌기 때문에 commenter 필드에 User 스키마의 사용자 ObjectId가 들어가는 것이다.