보안 전공생의 공부

MongoDB를 node.js에 연결하기 | mongoDB 연결 오류 문제 해결 본문

WEB/Node

MongoDB를 node.js에 연결하기 | mongoDB 연결 오류 문제 해결

수잉 2021. 10. 4. 15:53

· 전역함수(global variable) vs 지역함수(local variable)

 : 전역함수는 프로그램 전체에서 접근 가능,

   지역함수는 일정한 범위 내에서만 접근 가능

 

· 환경변수(environment variable)

 : 변수를 프로그램이 실행되는 환경에 저장하여

  해당 시스템의 모든 프로그램들이 사용할 수 있는 변수

  ex) PATH (PATH에 등록된 경로에 있는 실행파일들은 어디서든 실행 가능함)

 

 

 

mogoDB에 가입하여 DB를 사용할 준비를 해야한다.

먼저, datbase user을 생성하였다.

 

그리고 IP whitelist를 설정하였다. Allow access frome anywhere로 access를 설정하여 아무 IP에서나 접속이 가능하다.

 

이제 cluster connection을 하면 된다.

DB에 접속할 수 있는 방법으로 connect your application을 이용했다.

connection string을 얻어 사용하는 방법이다.

<password>부분을 아까 입력한 password로 바꾸어 사용하면 된다.

 

환경변수에 connetion string을 MONGO_DB라는 이름으로 저장하였다.

+) 위의 변수값을 잘못된 값 ! 오류발생해서 밑에서 수정함

 

- 출처 : https://www.a-mean-blog.com/ko/blog/%EB%8B%A8%ED%8E%B8%EA%B0%95%EC%A2%8C/_/mongoDB-Atlas-%EA%B0%80%EC%9E%85-%EB%B0%A9%EB%B2%95-%EB%AC%B4%EB%A3%8C-mongo-DB-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%84%9C%EB%B9%84%EC%8A%A4

 

단편강좌: mongoDB Atlas 가입 방법(무료 mongo DB 클라우드 서비스) - A MEAN Blog

https://mongodb.com 에서 무료로 온라인 Mongo DB를 생성해 봅시다(계정당 0.5GB DB 무료). 생성된 DB는 connection string을 사용해 각종 프로젝트에 사용할 수 있습니다. https://www.mongodb.com/cloud/atlas 에 접속합

www.a-mean-blog.com

 


프로젝트에 DB를 연결할 차례이다.

 

이를 위해 필요한 package를 설치해야 한다.

npm install ejs express mongoose --save 

 

그리고 기존의 index.js 파일에 필요한 코드를 추가하였다.

//index.js


const express=require('express')//모듈 가져오기
const mongoose=require('mongoose')
var methodOverride = require('method-override');
const app = express()//어플리케이션 생성

app.set('views', __dirname+'/views') //템플릿
app.set('view engine','ejs')//템플릿 엔진
app.engine('html',require('ejs').renderFile)
app.use(express.static(__dirname+'/public'));//서버에 요청할 때마다 무조건 콜배함수 실행됨

app.use(express.json());
app.use(express.urlencoded({extended:true}));
app.use(methodOverride('_method'));

// DB setting
mongoose.connect(process.env.MONGO_DB);
var db = mongoose.connection; 

db.once('open', function(){
  console.log('DB connected');
})

db.on('error', function(err){
  console.log('DB ERROR : ', err);
});

app.get('/welcome', (req,res)=>{
  res.render('welcome', {name:req.query.nameQuery});
})

app.get('/welcome/:nameParam',(req,res)=>{
  res.render('welcome', {name:req.params.nameParam});
})

//port setting
const server=app.listen(3000, ()=>{
  console.log('Start Server : localhost:3000')
})

mongoose는 mongodb와 node.js의 오브젝트를 연결해주는 ORM library이다.

mongoose 변수를 선언해주었다.

16~17번째 줄은 db setting을 위한 부분이다.

 

- process.env object는 환경변수들을 가지고 있는 객체이다.

환경변수에 MONGO_DB를 저장하였기 때문에 

node.js 코드상에서 process.env.MONGO_DB로 그 값을 불러올 수 있다.

 

- mongoose.connection(<connection string>) 함수로 db를 연결할 수 있다.

 

- 변수 db에 mongoose의 db object를 가져와 넣는다. 

 

19~21번째 줄은 db가 성공적으로 연결된 경우, 'DB connected를 출력하는 코드이다.

23~25번째 줄은 db가 연결되지 못한 경우, 'DB ERROR : '+ error를 출력하는 코드이다.

(db연결은 앱이 실행되면 단 한 번만 일어나므로 db.once를 사용하고,

error는 다양한 경우에 발생할 수 있기 때문에 db.on을 사용한다.)

 

 

[실행]

node index.js 말고 nodemon을 사용해 서버를 실행하였다.

nodemon은 서버를 실행하면서 코드가 변경되면 자동으로 서버를 재시작해준다.

 

npm install nodemon --global 명령어로 설치한다.

nodemon은 프로젝트 자체와 무관하고 컴퓨터에 직접 설치되는 것이므로 --global 옵션을 사용해서 설치한다.

 

설치되면 package.json이 있는 위치에서 nodemon 명령어만으로 바로 서버를 실행할 수 있다.

근데 요지랄

nodemon을 사용하려 했더니 위와 같은 오류가 생겼다.

'이 시스템에서 스크립트를 실행할 수 없으므로 ~.ps1 파일을 로드할 수 없습니다'

 

열심히 구글링 한 결과

https://singa-korean.tistory.com/21

 

[PowerShell] VSCode 터미널 오류 : 이 시스템에서 스크립트를 실행할 수 없으므로 ~ .ps1 파일을 로드할

VSCode 에서 npm을 설치하고 사용하고자 할 때 아래와 같은 어려움에 부딪칠 수 있다. 이는 스크립트 실행 권한이 제한되어 있는 상태이기 때문이다. 스크립트 실행 권한을 변경하기 위해서는 Window

singa-korean.tistory.com

위의 포스팅을 통해 해결할 수 있었다.

 

powershell을 관리자 권한으로 실행하여,

get-help Set-ExecutuionPolicy 를 입력한다.

Y를 입력한다.

 

- Set-ExecutuionPolicyRemoteSigned 권한을 설정할 수 있는데, 이는 로컬 컴퓨터에서 본인이 생성한 스크립트만 실행 가능 또는 인터넷에서 다운로드 받은 스크립트는 신뢰된 배포자에 의해 서명된 것만 실행 가능한 정책이다.

(출처 : https://singa-korean.tistory.com/21 )

 

그리고나서 Set-ExecutuionPolicy RemoteSigned를 입력하고

또 Y를 입력하면 해결된다.

 

- RemoteSigned로 정책을 설정하여 권한을 변경한 것이다. 

이를 통해 위의 오류를 해결하였다.

 

다시 터미널에 nodemon을 입력하면 정상작동하는 것을 확인할 수 있다.

근데 db에 연결되었는지, 에러가 발생했는지 콘솔창에 출력되지 않고

밑과 같은 문구만 자꾸 뜬다.

UnhandledPromiseRejectionWarning: MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string.

 

 

아까 환경변수에 넣은 connection string에 myfirstDatabase 부분database명으로 수정하여 입력했어야 했던 것이다.

connection string

그런데 database명이 뭔지 알 수가 없어 구글링해보니 

https://stackoverflow.com/questions/63224330/where-do-i-find-my-dbname-for-mongodb-connection-string/65015649

 

Where do I find my dbname for MongoDB connection string?

I'm trying to connect my app to mongodb, and I got a connection string from mongodb atlas, requiring me to replace username and password, which I get it, but it also says replace dbname with database

stackoverflow.com

collections에 들어가서 database를 만들어야 했다 !

우선 test 라는 database를 만들고

환경변수를 다시 편집했다.

myFirstDatabase -> test로 수정

다시 설정하고 나서도 계속 안되길래

visual studio code를 닫았다가 다시 켜보니까

 

DB connection이 콘솔창에 출력되었따 !!!

성-공

'WEB > Node' 카테고리의 다른 글

주소록 만들기 / module  (0) 2021.10.14
주소록 만들기 / show, edit, update, destroy  (0) 2021.10.07
주소록 만들기 / index, new, create  (0) 2021.10.07
정적 웹사이트 제작  (0) 2021.09.29
express 모듈로 서버 구성하기  (0) 2021.09.22
Comments