From ab11e23bea6d1eb2c55390d0e859477904eca06a Mon Sep 17 00:00:00 2001
From: Lucendio <dev@lucend.io>
Date: Thu, 9 Apr 2020 02:34:55 +0200
Subject: [PATCH] [app/server] service does not require db connection anymore
 to come up properly

* change behaviour so that service still comes up regardless whether db connection
  can be established or not (see 12-Factor-App) - loosely tight to backing service
* instead, it will log to stderr hinting this issue
* successful port binding is still required
---
 app/server/src/db/mongo.js         | 31 ++++++++++++++++++++++--------
 app/server/src/index.js            |  9 ++-------
 app/server/src/models/Uers.test.js | 13 ++++++-------
 3 files changed, 31 insertions(+), 22 deletions(-)

diff --git a/app/server/src/db/mongo.js b/app/server/src/db/mongo.js
index caab34d..16c5284 100644
--- a/app/server/src/db/mongo.js
+++ b/app/server/src/db/mongo.js
@@ -1,15 +1,30 @@
 const mongoose = require('mongoose');
 
 
-const mongooseInstance_ = mongoose.connect(process.env.MONGODB_URL, {
-    useNewUrlParser: true,
-    useCreateIndex: true,
-    useFindAndModify: false,
-    useUnifiedTopology: true,
+const mongooseInstance_ = mongoose.connect(
+    process.env.MONGODB_URL,
+    {
+        useNewUrlParser: true,
+        useCreateIndex: true,
+        useFindAndModify: false,
+        useUnifiedTopology: true,
 
-    // NOTE: as of the docs `connectTimeoutMS` should be used when `useUnifiedTopology: true`,
-    // but apparently it has no impact what so ever. Instead, the following works ¯\_(ツ)_/¯
-    serverSelectionTimeoutMS: 7000  // 7 sec
+        // NOTE: as of the docs `connectTimeoutMS` should be used when `useUnifiedTopology: true`,
+        // but apparently it has no impact what so ever. Instead, the following works ¯\_(ツ)_/¯
+        serverSelectionTimeoutMS: 10000  // 10 sec
+    },
+    function( err ){
+        if( typeof err !== 'undefined' && err !== null ){
+            console.error( new Error( `Cannot connect to database: ${ process.env.MONGODB_URL }` ) );
+        }else{
+            console.log( `Connect established to database: ${ process.env.MONGODB_URL }` );
+        }
+    }
+);
+
+process.on( 'exit', async ()=>{
+    const dbClient = await mongooseInstance_;
+    dbClient.disconnect();
 });
 
 
diff --git a/app/server/src/index.js b/app/server/src/index.js
index 63432c5..10c7256 100644
--- a/app/server/src/index.js
+++ b/app/server/src/index.js
@@ -39,19 +39,14 @@ app.use(errorRoutes);
 
 (async function main(){
     try{
-        const dbClient = await dbClientInstance_;
-        process.on( 'exit', ()=>{
-            dbClient.disconnect();
-        });
-
         await new Promise( (__ful, rej__ )=>{
             app.listen(port, function(){
                 console.log( `ToDo server is up on port ${ port }`);
                 __ful();
             }).on( 'error', rej__);
         });
-    }catch(e){
-        console.error( new Error( `Cannot connect to database ${ process.env.MONGODB_URL }` ) );
+    }catch( err ){
+        console.error( err );
         process.exit( 1 );
     }
 })();
diff --git a/app/server/src/models/Uers.test.js b/app/server/src/models/Uers.test.js
index 5852d0f..28356ae 100644
--- a/app/server/src/models/Uers.test.js
+++ b/app/server/src/models/Uers.test.js
@@ -5,16 +5,15 @@ const { model: Users } = require( './Users.js' );
 
 describe( 'Model: Users', ()=>{
     beforeAll( async ()=>{
-        await dbClientInstance_;
+        try{
+            await dbClientInstance_;
+        }catch( err ){
+            console.error( new Error( `Cannot connect to database: ${ process.env.MONGODB_URL }` ) );
+            process.exit( 1 );
+        }
     });
 
 
-    const userData = {
-        name: 'myname',
-        email: 'myname@example.com',
-        password: 'mypassword'
-    };
-
     test( 'creating a user', async ()=>{
         const userData = {
             name: 'myname',
-- 
GitLab