2
votes

I'm working on a simple CRUD Application with PostgreSQL, Sequelize and Express. And following this tutorial as a reference. There seems to be an issue with my model or db connectivity. Please find below details:

Folder structure:
server
|__config
   |__db.js
   |__env.js
|__models
   |__missions.js
|__router
   |__routes
      |__missions.js
   |__index.js
|__index.js

package.json

server/config/db.js

'use strict'

const Sequelize = require('sequelize');
const env = require('./env');
const sequelize = new Sequelize(env.DATABASE_NAME,             
env.DATABASE_USERNAME, env.DATABASE_PASSWORD, {
  host: env.DATABASE_HOST,
  port: env.DATABASE_PORT,
  dialect: env.DATABASE_DIALECT,
  define: {
    underscored: true
  }
});


const db = {};

db.Sequelize = Sequelize;
db.sequelize = sequelize;


db.missions = require('../models/missions.js')(sequelize, Sequelize);


module.exports = db;

server/config/env.js

'use strict';

const env = {
  PORT: process.env.PORT || 4000,
  DATABASE_URL: process.env.DATABASE_URL || 
'postgres://user001:YourPassword@YourHost:5432/oscdbtest1',
  DATABASE_NAME: process.env.DATABASE_NAME || 'oscdbtest1',
  DATABASE_HOST: process.env.DATABASE_HOST || 'localhost',
  DATABASE_USERNAME: process.env.DATABASE_USERNAME || 'user001',
  DATABASE_PASSWORD: process.env.DATABASE_PASSWORD || 'password001',
  DATABASE_PORT: process.env.DATABASE_PORT || 5432,
  DATABASE_DIALECT: process.env.DATABASE_DIALECT || 'postgres',

  NODE_ENV: process.env.NODE_ENV || 'development',
};

module.exports = env;

models/missions.js

'use strict'

module.exports = (sequelize, DataTypes) => {  
  const Mission = sequelize.define('missions', {
    id: {
      type: DataTypes.UUID,
      primaryKey: true,
      defaultValue: DataTypes.UUIDV4
    },
    mission_name: {
      type: DataTypes.STRING,
      required: true
    },
    launchvechicle_name: {
      type: DataTypes.STRING,
      required: true
    },
    status: {
      type: DataTypes.STRING,
      required: true
    },
  });
  return Mission;
};

router/routes/missions.js

'use strict';

module.exports = (app, db) => {  
  app.get('/missions', (req, res) => {
    db.missions.findAll()
      .then(missions => {
        res.json(missions);
      });
  });

  app.get('/mission/:id', (req, res) => {
   const id = req.params.id;
     db.missions.find({
      where: { id: id}
      })
      .then(mission => {
        res.json(missions);
      });
  });

} 

router/index.js

'use strict'

const routes = [
  require('./routes/missions')
];



module.exports = function router(app, db) {
  return routes.forEach((route) => {
    route(app, db);
  });
};

index.js

'use strict';

const express = require('express'),
  bodyParser = require('body-parser'),
  morgan = require('morgan'),
  db = require('./server/config/db.js'),
  env = require('./server/config/env'),
  router = require('./server/router/index');

const app = express();
const PORT = env.PORT;

app.use(morgan('combined'));
app.use(bodyParser.json());

app.use((req, res, next) => {
  res.header('Content-Type', 'application/json');
  next();
});

router(app, db);

db.sequelize.sync().then(() => {
  app.listen(PORT, () => {
     console.log('Express listening on port:', PORT);
  });
});

package.json

{
  "name": "osctest1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
  "dev": "nodemon index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "morgan": "^1.9.1",
    "nodemon": "^1.19.1",
    "pg": "^7.11.0",
    "pg-hstore": "^2.3.3",
    "sequelize": "^5.8.7",
    "sequelize-cli": "^5.4.0"
  },
  "devDependencies": {
    "nodemon": "^1.19.1"
  }
}

Postgres Query for creating the table:

CREATE TABLE missions(
   item_id serial PRIMARY KEY,
   mission_name VARCHAR (50) NOT NULL,
   launchvehicle_name VARCHAR (50) NOT NULL,
   status VARCHAR (50) NOT NULL
);

Error in Postman
[GET] http://localhost:4000/missions

TypeError: Cannot read property 'findAll' of undefined at /home/gx/Documents/projects/OSCTest1/server/router/routes/missions.js:5:16 at Layer.handle [as handle_request] (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/layer.js:95:5) at next (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/layer.js:95:5) at /home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:335:12) at next (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:275:10) at /home/gx/Documents/projects/OSCTest1/index.js:19:3 at Layer.handle [as handle_request] (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:317:13) at /home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:335:12) at next (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:275:10) at jsonParser (/home/gx/Documents/projects/OSCTest1/node_modules/body-parser/lib/types/json.js:110:7) at Layer.handle [as handle_request] (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:317:13) at /home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:335:12) at next (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/index.js:275:10) at logger (/home/gx/Documents/projects/OSCTest1/node_modules/morgan/index.js:144:5) at Layer.handle [as handle_request] (/home/gx/Documents/projects/OSCTest1/node_modules/express/lib/router/layer.js:95:5)

1
The error message should point to the line of code that is causing the problem. routes/missions.js: - is there a clerical error? If not, try stepping through the code.wahwahwah
The error has to do with db.missions, meaning it can’t find the ‘missions’ table in the db. In the mission.js you define it as Mission, and here you call it missions.N8888
Test this line here from the db.js file : db.missions = require('../models/missions.js')(sequelize, Sequelize);N8888

1 Answers

0
votes

try following

db.missions = require('../models/missions.js')(sequelize, Sequelize)

In router/routes/missions.js

const db = require('server/config/db.js');
const Mission = db.missions;  
module.exports = (app, db) => {  
          app.get('/missions', (req, res) => {
            Mission.findAll()
              .then(missions => {
                res.json(missions);
              });
          });

          app.get('/mission/:id', (req, res) => {
           const id = req.params.id;
             Missions.find({
              where: { id: id}
              })
              .then(mission => {
                res.json(missions);
              });
          });

        }