본문 바로가기
IT

Day10

by 깻잎쌈 2020. 2. 4.
반응형

라우팅정보 -> 서버연결 -> 스키마정의, 사용자모델정의 

app.js

var config = require('./config'),
    route_loader = require('./routes/router_loader'),
    user = require('./routes/user'),
    database = require('./database/database');

...
app.set('port', process.env.port || config.server_port);

route_loader.init(app, express.Router());

...
app.listen(app.get('port'), function () {
    console.log('Server Started ' + app.get('port'));

    //db연결
    database.init(app, config);
});
더보기
var express = require('express'),
    http = require('http'),
    path = require('path');

var bodyParser = require('body-parser'),
    static = require('serve-static'),
    expressErrorHandler = require('express-error-handler'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session');

var mongoClient = require('mongodb').MongoClient,
    mongodb = require('mongodb'),
    mongoose = require('mongoose');

var crypto = require('crypto');

var config = require('./config'),
    route_loader = require('./routes/router_loader'),
    user = require('./routes/user'),
    database = require('./database/database');


var app = express();

app.set('port', process.env.port || config.server_port);

app.use(bodyParser.urlencoded({
    extended: false
}));
app.use(bodyParser.json());
app.use('/public', static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(expressSession({
    secret: 'my key',
    resave: true,
    saveUninitialized: true
}));

route_loader.init(app, express.Router());

var errorHandler = expressErrorHandler({
    static: {
        '404': './public/404.html'
    }
});

app.use(expressErrorHandler.httpError(404));
app.use(errorHandler);


app.listen(app.get('port'), function () {
    console.log('Server Started ' + app.get('port'));

    //db연결, 스키마 & 모델 정의
    database.init(app, config);
});

config.js //  설정파일

module.exports = {
    
    server_port :3000,
    db_url : 'mongodb://localhost:27017/local',
    
    db_schemas : [
        {file:'./user_schema', collection:'users3', schemaName: 'userSchema',
        modelName:'userModel'}
    ],
    
    route_info : [
        {file:'./user', path:'/process/login', method:'login', type: 'post'},
        {file:'./user', path:'/process/adduser', method:'adduser', type: 'post'},
        {file:'./user', path:'/process/listuser', method:'listuser', type: 'post'}
    ]
}

routes/route_loader.js

config.js 사용하기 위해 require('../config'); //점2개 #상대경로 

더보기
var route_loader = {};
var config = require('../config');


route_loader.init = function(app, router) {
	console.log('route_loader.init 호출됨.');
	
    return initRoutes(app, router);
}

// route_info에 정의된 라우팅 정보 처리
function initRoutes(app, router) {

	var infoLen = config.route_info.length;
	console.log('설정에 정의된 라우팅 모듈의 수 : %d', infoLen);
 
	for (var i = 0; i < infoLen; i++) {
		var curItem = config.route_info[i];
			
		// 모듈 파일에서 모듈 불러옴
		var curModule = require(curItem.file);
		console.log('%s 파일에서 모듈정보를 읽어옴.', curItem.file);
		
        //  라우팅 처리
        // router.route('/process/adduser').post(user.adduser);
		if (curItem.type == 'get') {
            router.route(curItem.path).get(curModule[curItem.method]);
		} else if (curItem.type == 'post') {
            router.route(curItem.path).post(curModule[curItem.method]);
		} else {
			router.route(curItem.path).post(curModule[curItem.method]);
		}
        	
		console.log('라우팅 모듈 [%s] 설정됨.', curItem.method);
        console.log('라우팅 경로 : '+ curItem.path);
	}
    
    
    // 라우터 객체 등록
    app.use('/', router);
}

module.exports = route_loader;

database/database.js

user_schema.js 파일을 로딩하여 실행만 할뿐.

더보기
var mongoose = require('mongoose');

var database = {};

database.init = function(app, config){
    console.log('init 함수 호출됨 ');
    
    connect(app, config);
}

function connect(app, config){
    console.log('connect 함수 호출됨')
    
    var databaseUrl = 'mongodb://localhost:27017/local';

    //db 연결
    console.log('....db에 연결합니다. ');
    //기본 promise(mPromise)를 노드의 promise로 교체
    mongoose.promise = global.promise;
    mongoose.connect(databaseUrl);
    database = mongoose.connection;

    //db 연결이 안됬을때 
    database.on('error', console.error.bind(console, 'mongoose 연결 error'));

    //db가 연결됬을때 
    database.on('open', function () {
        console.log('db에 연결됬습니다. :' + databaseUrl);

        // 스키마 및 모델 정의★
        createSchema(app,config);
    });

    //연결이 끊어졌을때  5초 후 다시 연결 
    database.on('disconnected', function () {
        console.log('연결 끊어짐. 5초후 다시 연결합니다');
        setInterval(connectDB, 5000);
    });
    
    
    // app 객체에 database 속성 추가
    app.set('database', database);
}

function createSchema(app, config){ 
    var schemaLen =  config.db_schemas.length
    console.log('config에 정의된 스키마 수 : '+ schemaLen);
    
    for(var i = 0;i<schemaLen;i++){
        var curItem = config.db_schemas[i];
        
        var curSchema = require(curItem.file).createSchema(mongoose); // user_schema에 정의된 createSchema 함수임 
        console.log('%s 모듈을 물러온 후 스키마 정의함 ', curItem.file); // './database/user_schema'
        
        // 사용자 모델 정의 
        var curModel = mongoose.model(curItem.collection, curSchema);
        console.log('%s 컬렉션을 위한 모델 정의함 ', curItem.collection);
        
        //database 객체에 속성 추가
        database[curItem.schemaName] = curSchema;
        database[curItem.modelName] = curModel;
        console.log('스키마이름 : %s, 모델이름 : %s이 database 객체의 속성으로 추가됨', curItem.schemaName, curItem.modelName); // config.db_schemas[i].modelName
    }
    
    app.set('database', database);
    console.log('database 객체가 app 객체의 속성으로 추가됨')
    
}

module.exports = database;

database/user_schema.js

더보기
var mongoose = require('mongoose');
var database = {};

database.init = function(app, config){
    console.log('init 함수 호출됨 ');
    
    connect(app, config);
}

function connect(app, config){
    console.log('connect 함수 호출됨')
    
    var databaseUrl = 'mongodb://localhost:27017/local';

    //db 연결
    console.log('....db에 연결합니다. ');
    //기본 promise(mPromise)를 노드의 promise로 교체
    mongoose.promise = global.promise;
    mongoose.connect(databaseUrl);
    database = mongoose.connection;

    //db 연결이 안됬을때 
    database.on('error', console.error.bind(console, 'mongoose 연결 error'));

    //db가 연결됬을때 
    database.on('open', function () {
        console.log('db에 연결됬습니다. :' + databaseUrl);

        // 스키마 및 모델 정의
        createSchema(app,config);
    });

    //연결이 끊어졌을때  5초 후 다시 연결 
    database.on('disconnected', function () {
        console.log('연결 끊어짐. 5초후 다시 연결합니다');
        setInterval(connectDB, 5000);
    });
    
    
    // app 객체에 database 속성 추가
    app.set('database', database);
}

function createSchema(app, config){ 
    var schemaLen =  config.db_schemas.length
    console.log('config에 정의된 스키마 수 : '+ schemaLen);
    
    for(var i = 0;i<schemaLen;i++){
        var curItem = config.db_schemas[i];
        
        var curSchema = require(curItem.file).createSchema(mongoose); // user_schema에 정의된 createSchema 함수임 
        console.log('%s 모듈을 물러온 후 스키마 정의함 ', curItem.file); // './database/user_schema'
        
        // 사용자 모델 정의 
        var curModel = mongoose.model(curItem.collection, curSchema);
        console.log('%s 컬렉션을 위한 모델 정의함 ', curItem.collection);
        
        //database 객체에 속성 추가
        database[curItem.schemaName] = curSchema;
        database[curItem.modelName] = curModel;
        console.log('스키마이름 : %s, 모델이름 : %s이 database 객체의 속성으로 추가됨', curItem.schemaName, curItem.modelName); // config.db_schemas[i].modelName
    }
    
    app.set('database', database);
    console.log('database 객체가 app 객체의 속성으로 추가됨')
    
}

module.exports = database;
반응형

'IT' 카테고리의 다른 글

Day11  (0) 2020.02.05
Html] CSS 속성  (0) 2020.02.05
Day 9  (0) 2020.02.02
Day8  (0) 2020.02.01
Day7 -1  (0) 2020.01.31

댓글