req.app.get('db') is undefined when using Massive JS in my Node Application

814 Views Asked by At

I am building a Node application using Express, Massive JS, and Postgresql. I was using sequelize but decided to try Massive JS, so I started converting my code to use it.

I have a login endpoint that I'm trying to reach from my Angular 5 app and I am getting an error. This error only occurs on my deployed application. It does work locally without any issues.

Here is the specific error:

TypeError: Cannot read property &#39;get_user&#39; of undefined<br> &nbsp; &nbsp;at login (/root/firstImpression/server/features/auth/authController.js:7:26)

Here is my folder structure:

+Server
   -server.js
   +config
     -secrets.js
   +db
     -get_user.sql
   +features
     +auth
       -authController.js
       -authRoutes.js

server.js file contents:

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
const cookieParser = require('cookie-parser');
const secrets = require('./config/secrets');
const massive = require('massive');

// used to create, sign, and verify tokens
var jwt = require('jsonwebtoken'); 

// Parsers
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));
app.use(cookieParser());

//routes 
require('./features/auth/authRoutes')(app);

//Connect to database
massive(secrets.development).then(db => {
app.set('db', db);
});

// Angular DIST output folder
app.use(express.static(path.join(__dirname, '../dist')));

//Set up static files
app.use(express.static('../dist'));

// Send all other requests to the Angular app
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '../dist/index.html'));
});

//Set Port
const port = process.env.PORT || '3000';
app.set('port', port);

const server = http.createServer(app);

server.listen(port, () => console.log(`Running on localhost:${port}`));

get_user.sql file contents:

SELECT * FROM users WHERE username = $1;

authController.js file contents:

const jwt     = require('jsonwebtoken');
const secrets = require('../../config/secrets');
const bcrypt  = require('bcrypt');

module.exports = {
    login: (req, res) => {
        req.app.get('db').get_user(req.body.username).then(user => {
          if(user[0]) {
            bcrypt.compare(req.body.password, user[0].password, 
            function(err, result) {
                if(result) {
                    var token = jwt.sign({user}, secrets.tokenSecret, 
                                {expiresIn: '1h'});
                    res.status(200).json({
                        token: token,
                        user: user
                    })
                } else {
                    res.status(200).json("Invalid username and/or 
                    password.");
                }
            });
        } else {
            res.status(200).json("Could not find that user.");
         }
      })
   }
}

authRoutes.js file contents:

var authController = require('./authController');

module.exports = (app) => {

    app.post('/user-auth', authController.login);

}

The error is occuring in the authController.js file on this line:

req.app.get('db').get_user(req.body.username)

I've been reading the docs for massive js and learned the importance of keeping the DB folder on the same level where it's initialized, which is my server.js file.

As I stated earlier, when I run this on my local machine, it works great; However as soon as I deploy it to my live environment, I receive the error.

Any help or direction would be greatly appreciated. Let me know if any other information is required, and I will gladly provide it.

1

There are 1 best solutions below

0
Striped On

Your app setup should probably be wrap like

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
const cookieParser = require('cookie-parser');
const secrets = require('./config/secrets');
const massive = require('massive');

// used to create, sign, and verify tokens
var jwt = require('jsonwebtoken'); 

//Connect to database
massive(secrets.development).then(db => {
    // Parsers
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false}));
    app.use(cookieParser());
    app.set('db', db);
    // Angular DIST output folder
    app.use(express.static(path.join(__dirname, '../dist')));

    //routes 
    require('./features/auth/authRoutes')(app);

    //Set up static files
    app.use(express.static('../dist'));

    // Send all other requests to the Angular app
    app.get('*', (req, res) => {
        res.sendFile(path.join(__dirname, '../dist/index.html'));
    });

    //Set Port
    const port = process.env.PORT || '3000';
    app.set('port', port);

    const server = http.createServer(app);

    server.listen(port, () => console.log(`Running on localhost:${port}`));
});