몽고디비 연결하기
노드와 몽고디비를 몽구스를 통해 연결해보겠습니다. 몽고디비는 주소를 사용해 연결합니다. 주소 형식은 mongodb://[username:password@localhost[:port][/[database][?options]]와 같습니다. [ ] 부분은 없어도 되고 있어도 됨을 의미합니다.
username과 password에 몽고디비 계정 이름과 비밀번호를 넣습니다. host가 localhost, port가 27017, 계정이 있는 database가 admin이므로 주소는 다음과 같이 됩니다.
먼저 schemas 폴더를 루트 디렉터리에 생성합니다. 폴더 안에 index.js 파일을 생성한 후 내용을 다음과 같이 넣습니다.
const mongoose = require("mongoose");
const connect = () => {
if (process.env.NODE_ENV !== "production") {
mongoose.set("debug", true);
} // ➊
mongoose.connect(
"mongodb://root:1234@localhost:27107/admin",
{
dbName: "nodejs",
useNewUrlParser: true,
useCreateIndex: true,
},
(error) => {
if (error) {
console.log("몽고디비 연결 에러", error);
} else {
console.log("몽고디비 연결 성공");
}
}
);
}; // ➋
mongoose.connection.on("error", (error) => {
console.error("몽고디비 연결 에러", error);
}); // ➌
mongoose.connection.on("disconnected", () => {
console.error("몽고디비 연결이 끝겼습니다. 연결을 재시도합니다.");
connect();
}); // // ➌
module.exports = connect;
➊ 개발 환경일 때만 콘솔을 통해 몽구스가 생성하는 쿼리 내용을 확인할 수 있게 하는 코드입니다.
➋ 몽구스와 몽고디비를 연결하는 부분입니다. 몽고디비 주소로 접속을 시도합니다. 비밀번호(nodejsbook 부분)를 자신의 비밀번호로 바꾸는 것을 잊지 마세요! 접속을 시도하는 주소의 데이터베이스는 admin이지만, 실제로 사용할 데이터베이스는 nodejs이므로 두 번째 인수로 dbName 옵션을 줘서 nodejs 데이터베이스를 사용하게 했습니다. 마지막 인수로 주어진 콜백 함수를 통해 연결 여부를 확인합니다.
useNewUrlParser: true는 입력하지 않아도 되지만 콘솔에 경고 메시지가 나타나므로 넣었습니다.
➌ 몽구스 커넥션에 이벤트 리스너를 달아뒀습니다. 에러 발생 시 에러 내용을 기록하고, 연결 종료 시 재연결을 시도합니다.
app.js를 만들고 schemas/index.js와 연결합니다.
app.js를 만들고 schemas/index.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", "hmtl");
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 error = new Error(`${req.method} ${req._construct.url} 라우터가 없습니다.`);
error.status = 404;
next(error);
})
app.use((err, req, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.reder('error');
})
app.listen(app.get('port'), () => {
console.log(app.get('port'), ' 번 포트에서 대기 중');
});