From f0552f6bfd0b5a281248c33e1e553e9401ee21e2 Mon Sep 17 00:00:00 2001 From: Braun Patrik Date: Wed, 4 May 2016 22:06:52 +0200 Subject: [PATCH] DatabaseManager.ts error handling update --- backend/model/mongoose/DatabaseManager.ts | 72 ++++++++++++----------- backend/server.ts | 51 +++++++--------- test/backend/initMongo.ts | 47 +++++++-------- 3 files changed, 80 insertions(+), 90 deletions(-) diff --git a/backend/model/mongoose/DatabaseManager.ts b/backend/model/mongoose/DatabaseManager.ts index a7b0b57..dd2d46f 100644 --- a/backend/model/mongoose/DatabaseManager.ts +++ b/backend/model/mongoose/DatabaseManager.ts @@ -1,53 +1,55 @@ /// -import * as mongoose from 'mongoose'; +import * as mongoose from "mongoose"; import {Schema} from "mongoose"; -export class DatabaseManager{ + +export class DatabaseManager { private static _instance:DatabaseManager = null; private connectionError = false; + private errorObject = null; + private connectionOpen = false; - constructor(onError?:(err)=>void,onConnected?:() =>void){ - mongoose.connection.on('error', function (err) { - this.connectionError = true; - if(onError){ - onError(err); - } - }); - mongoose.connection.on('connected', function () { - if(onConnected){ - onConnected(); - } - }); - try { - mongoose.connect('mongodb://localhost/EQZT6L'); - }catch(ex){ - this.connectionError = true; - if(onError){ - onError(ex); - } - } + constructor() { + mongoose.connect('mongodb://localhost/EQZT6L'); } - public static getInstance(onError?:(err)=>void,onConnected?:() =>void){ - if(DatabaseManager._instance === null){ - DatabaseManager._instance = new DatabaseManager(onError,onConnected); - }else{ - if(DatabaseManager._instance.connectionError === false && onConnected){ - onConnected(); - } - } + public static getInstance(onError?:(err)=>void, onConnected?:() =>void) { + if (DatabaseManager._instance === null) { + DatabaseManager._instance = new DatabaseManager(); + } return DatabaseManager._instance; } - public getModel(name:string,schema:any){ - return mongoose.model(name,new Schema(schema)); + public onConnectionError(onError:(err) => void){ + if (this.connectionError === true) { + return onError(DatabaseManager._instance.errorObject); + } + mongoose.connection.once('error', (err) => { + this.connectionError = true; + this.errorObject = err; + onError(err); + }); + } + + public onConnected(onConnected:() => void){ + if (this.connectionOpen === true) { + return onConnected(); + } + mongoose.connection.once('open', (err) => { + this.connectionOpen = true; + onConnected(); + }); } - public disconnect(){ + public getModel(name:string, schema:any) { + return mongoose.model(name, new Schema(schema)); + } + + public disconnect() { mongoose.disconnect(); } - - public isConnectionError(){ + + public isConnectionError() { return this.connectionError; } } \ No newline at end of file diff --git a/backend/server.ts b/backend/server.ts index 0c7ee3a..7201561 100644 --- a/backend/server.ts +++ b/backend/server.ts @@ -1,20 +1,18 @@ /// -import * as _express from 'express'; -import * as _session from 'express-session'; -import * as _bodyParser from 'body-parser'; -import * as _debug from 'debug'; -import * as _http from 'http'; +import * as _express from "express"; +import * as _session from "express-session"; +import * as _bodyParser from "body-parser"; +import * as _debug from "debug"; +import * as _http from "http"; import {PublicRouter} from "./routes/PublicRouter"; import {UserRouter} from "./routes/UserRouter"; import {GalleryRouter} from "./routes/GalleryRouter"; -import {AdminRouter} from "./routes/AdminRouter"; +import {AdminRouter} from "./routes/AdminRouter"; import {ErrorRouter} from "./routes/ErrorRouter"; import {SharingRouter} from "./routes/SharingRouter"; import {Config, DatabaseType} from "./config/Config"; import {ObjectManagerRepository} from "./model/ObjectManagerRepository"; -import {MongoGalleryManager} from "./model/mongoose/MongoGalleryManager"; -import {MongoUserManager} from "./model/mongoose/MongoUserManager"; import {DatabaseManager} from "./model/mongoose/DatabaseManager"; @@ -25,14 +23,14 @@ export class Server { private server:any; private port:number; - constructor(){ + constructor() { this.debug = _debug("PiGallery2:server"); this.app = _express(); this.app.set('view engine', 'ejs'); - if(process.env.DEBUG) { + if (process.env.DEBUG) { var _morgan = require('morgan'); this.app.use(_morgan('dev')); } @@ -41,10 +39,10 @@ export class Server { * Session above all */ this.app.use(_session({ - name:"pigallery2-session", + name: "pigallery2-session", secret: 'PiGallery2 secret', cookie: { - maxAge: 60000*10, + maxAge: 60000 * 10, httpOnly: false }, resave: true, @@ -57,31 +55,27 @@ export class Server { // for parsing application/json this.app.use(_bodyParser.json()); - - if(Config.databaseType === DatabaseType.memory){ + + if (Config.databaseType === DatabaseType.memory) { ObjectManagerRepository.MemoryMongoManagers(); - }else { - if (DatabaseManager.getInstance(()=>{ + } else { + ObjectManagerRepository.InitMongoManagers(); + DatabaseManager.getInstance().onConnectionError( + ()=> { console.error("MongoDB connection error. Falling back to memory Object Managers"); ObjectManagerRepository.MemoryMongoManagers(); - }).isConnectionError()) { - console.error("MongoDB connection error. Falling back to memory Object Managers"); - ObjectManagerRepository.MemoryMongoManagers(); - } else { - ObjectManagerRepository.InitMongoManagers(); - } + }); + } new PublicRouter(this.app); - + new UserRouter(this.app); new GalleryRouter(this.app); new SharingRouter(this.app); new AdminRouter(this.app); - - new ErrorRouter(this.app); - + new ErrorRouter(this.app); // Get PORT from environment and store in Express. @@ -99,8 +93,6 @@ export class Server { } - - /** * Event listener for HTTP server "error" event. */ @@ -143,8 +135,7 @@ export class Server { } - -if(process.env.DEBUG) { +if (process.env.DEBUG) { console.log("Running in DEBUG mode"); } diff --git a/test/backend/initMongo.ts b/test/backend/initMongo.ts index dc156eb..5177b1c 100644 --- a/test/backend/initMongo.ts +++ b/test/backend/initMongo.ts @@ -1,35 +1,32 @@ - import {MongoUserManager} from "../../backend/model/mongoose/MongoUserManager"; import {User, UserRoles} from "../../common/entities/User"; import {DatabaseManager} from "../../backend/model/mongoose/DatabaseManager"; -DatabaseManager.getInstance((err)=>{ + +DatabaseManager.getInstance().onConnectionError(()=> { DatabaseManager.getInstance().disconnect(); process.exit() -},()=>{ - let userManager = new MongoUserManager(); - userManager.createUser(new User(0,"demo","demo",UserRoles.Developer),(err)=>{ - DatabaseManager.getInstance().disconnect(); - process.exit() +}); + +DatabaseManager.getInstance().onConnected(()=> { + let userManager = new MongoUserManager(); + userManager.createUser(new User(0, "demo", "demo", UserRoles.Developer), (err)=> { + + userManager.createUser(new User(1, "developer", "developer", UserRoles.Developer), (err)=> { + + userManager.createUser(new User(2, "admin", "admin", UserRoles.Admin), (err)=> { + + userManager.createUser(new User(3, "user", "user", UserRoles.User), (err)=> { + + userManager.createUser(new User(4, "guest", "guest", UserRoles.Guest), (err)=> { + + DatabaseManager.getInstance().disconnect(); + process.exit() + }); + }); + }); + }); }); - userManager.createUser(new User(1,"developer","developer",UserRoles.Developer),(err)=>{ - DatabaseManager.getInstance().disconnect(); - process.exit() - }); - userManager.createUser(new User(2,"admin","admin",UserRoles.Admin),(err)=>{ - DatabaseManager.getInstance().disconnect(); - process.exit() - }); - - userManager.createUser(new User(3,"user","user",UserRoles.User),(err)=>{ - DatabaseManager.getInstance().disconnect(); - process.exit() - }); - - userManager.createUser(new User(4,"guest","guest",UserRoles.Guest),(err)=>{ - DatabaseManager.getInstance().disconnect(); - process.exit() - }); }); \ No newline at end of file