해당 모듈은 json형식을 완벽하게 따라해야되기 때문에 마지막 value 값 뒤 ,(콤마)를 붙이는 실수를 하면 안된다.
(나중에 큰 고생을 합니다..ㅜㅜ) 두 개의 파일의 순서도 똑같이 해줘야 한다.
4. app.js에 i18n을 설정해준다.
const i18n = require('./i18n');
app.use(i18n);
5. 클라이언트에서 버튼을 생성해준다
<div class="dropdown-menu dropdown-menu-right">
<ahref="/ko"class="dropdown-item d-flex justify-content-start align-items-center"><imgclass="flag"src="https://lipis.github.io/flag-icon-css/flags/4x3/kr.svg"alt="South Korea Flag">{{__('lang_kr')}}</a><ahref="/en"class="dropdown-item d-flex justify-content-start align-items-center"><imgclass="flag"src="https://lipis.github.io/flag-icon-css/flags/4x3/us.svg"alt="United States of America Flag">{{__('lang_en')}}</a></div>
const mongoose = require('mongoose');
const { Schema } = mongoose;
const { WORKER, COLLECTION_NAME, QUERY } = require('../const/consts'); //consts 파일들const Schemas = require('./schemas')
const { Worker } = Schemas; // 몽구스 model 파일들exports.modelQuery = async (query,collection,doc,option) => {
var doc = doc;
var Collection = Schemas[collection];
// console.log(Collection.prototype.schema.options.collection);var option = option;
var one;
var postJob; // 임의로 지정해줄 수도 있고, option으로 받아올 수도 있음 (부가적인 함수)if(option.postJob) {
postJob = option.postJob;
}
var resResult = (result) => { //함수가 끝나고 실행되는 콜백함수if (postJob != null) {
postJob();
}
return result;
};
if ( query == QUERY.Aggregate) {
var aggregatearray = [];
switch (collection) {
case COLLECTION_NAME.Alarm :
break;
case COLLECTION_NAME.Car :
break;
}
if(doc != undefined) {
if (doc.addFields) {
aggregatearray.push({$addFields : doc.addFields});
}
if (doc.lookup) {
aggregatearray.push({$lookup : doc.lookup});
}
if (doc.unwind) {
aggregatearray.push({$unwind : doc.unwind});
}
if (doc.match) {
aggregatearray.push({$match : doc.match});
}
if (doc.project) {
aggregatearray.push({$project : doc.project});
}
if (doc.sort) {
aggregatearray.push({$sort : doc.sort});
}
if (doc.limit) {
aggregatearray.push({$limit : doc.limit});
}
}
if (Object.keys(option).length != 0) {
if (option.limit) {
}
if (option.sort) {
}
}
else {
var one = await Collection.aggregate([aggregatearray]).then(resResult);
}
return one;
}
};
원래는 각 쿼리별 조건문이 다 들어있으나, 결국 방식은 비슷하기 때문에 mongoose의 쿼리문인 aggregate만 예시로 들었다. 방식은 전에 정의해두었던 consts 파일에서 사용할 schema(열거체)와 query, collection_name를 가져오고 모델을 미리 정의해두었던 schema(모델)을 가져온다.
그 다음 modelquery 함수를 정의하고, 인자 값을 query, collection, doc, option을 설정해서 어떤 스키마, 어떤 쿼리, 어떤 데이터가 들어오든 쿼리가 실행이 가능하도록 한다.
해당 오류가 뜬다면 이는 /etc/mongod.conf에서security.authorization이 true로 설정되어 있기 때문이었다. 책에서 사용하던 버전에서는 원래 주석처리되어 있었는지 이후에 추가하도록 되어있는데, 이번에 설치한 4.2.9 버전에서는 처음부터 작성되어 설치되어서 문제가 되었다.
잠깐 주석 처리하고sudo service mongod restart하니 정상적으로 admin 사용자를 추가할 수 있었다
7. 인증 설정
MongoDB에 접속할 때 인증과정이 이루어지도록 설정파일을 수정한다.
우선 MongoDB를 종료한 후 수정을 한다.
ubuntu@dev:~$ sudo service mongod stop
ubuntu@dev:~$ sudo vim /etc/mongod.conf
mongod.conf 설정파일의 security 항목의 주석을 해제한 후 그 하단에 authorization: enabled 를 추가한다.
security:
authorization: enabled
8. 인증 접속
MongoDB를 다시 실행한 후 등록한 계정 정보로 접속을 시도해 보자.
ubuntu@dev:~$ sudo service mongod start
ubuntu@dev:~$ mongo admin -u test -p test1234
9. 외부 접속 설정
MongoDB는 기본적으로 로컬호스트에서만 접속이 가능하도록 설정되어 있다. 외부 접속을 위해서는 net 항목의 bindIp 항목을 0.0.0.0으로 변경한다. (포트도 변경 가능)
1. 먼저 화면 구성을 해준다. 버튼을 눌렀을 경우 onclick으로 함수가 실행되도록 한다.(로그아웃도 동일)
2. HTML script - get메소드를 쓰기 때문에 location 을 바꿔주어서 백엔드에서 로직이 실행되도록 한다.
// 회원탈퇴 기능functionwithdrawal(i18nconvert) {
var answer;
//페이지를 이동하기 전에 confirm()을 사용해 다시 한번 확인한다.//확인을 선택하면 answer에 true, 취소를 선택하면 false 값이 들어간다.
answer = confirm(i18nconvert("layout_withdrawal_confirm"));
//확인을 선택한 경우 자바스크립트를 호출할 때 같이 넘어온 url이라는 변수에 들어있는 주소로 페이지 이동if(answer == true){
location = '/auth/withdrawal';
}
else {
returnfalse;
}
}
// 로그아웃 기능functionlogout(i18nconvert) {
var answer;
//페이지를 이동하기 전에 confirm()을 사용해 다시 한번 확인한다.//확인을 선택하면 answer에 true, 취소를 선택하면 false 값이 들어간다.
answer = confirm(i18nconvert("layout_signout_confirm"));
//확인을 선택한 경우 자바스크립트를 호출할 때 같이 넘어온 url이라는 변수에 들어있는 주소로 페이지 이동if(answer == true){
location = '/auth/logout';
}
else {
returnfalse;
}
}
3. 백엔드쪽에서 로그아웃은 쿠키가 삭제되도록, 회원탈퇴는 DB에서 데이터가 삭제되도록 한다.