Agung hallman maliki
Agung hallman maliki

Reputation: 93

Cannot read property 'findAll' of undefined sequelize express JS

I have a problem with my code when using sequelize auto. the problem is how to connect sequelize model to database setting on DB.js, so that we can using findall function or any else

Model :

/* jshint indent: 2 */
const db = require('../../db/database')
const sequelize = db.sequelize

module.exports = function(sequelize, DataTypes) {
  cust: sequelize.define('ms_customer', {
    id: {
      type: DataTypes.CHAR(10),
      allowNull: false,
      primaryKey: true
    },
    gender_id: {
      type: DataTypes.INTEGER(1),
      allowNull: true
    },
    status: {
      type: DataTypes.CHAR(1),
      allowNull: true
    }
  }, {
    tableName: 'ms_customer'
  });
};

DB.js connection :

const Sequelize = require('sequelize')

const sqlz = new Sequelize('db', 'user', 'pass', {
    host: 'localhost',
    dialect: 'mysql',
    pool: {
        max: 5,
        min: 10,
        idle: 10000
    }
}) 

sqlz
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

module.exports = {
    sqlz: sqlz,
    Sequelize: Sequelize
}

Query :

const customerModel = require('../../db/model/ms_customer')
const cust = customerModel.cust

module.exports = {
    modelGetCustomerById : (param,req,res) => {
            cust.findAll({
                where: {
                    id: {
                        param
                    }
                }
            }).then(customer => {
                // console.log(customer)
                res.json(customer)
            })
    }
}

Controller :

 const customer = require('../../db/query/customer')
    const sequelize = require('sequelize')

    module.exports = {
        getCustomerById: async(req,res) => {
            var customerId = req.params.id
            let getCustomerId = await customer.modelGetCustomerById(customerId) 
            // console.log(getCustomerId)
            if(!getCustomerId){
                return res.status(500).json({status: "Failed", message:"User not found"});
            }
            return res.status(200).json({status: "Success", message:getCustomerId});
        }
    }

why i always got error

Cannot read property 'findAll' of undefined

please help..

Upvotes: 2

Views: 8955

Answers (3)

ManzTIHAGI
ManzTIHAGI

Reputation: 146

I've running code without error on my project that remodel by sequelize-auto and connect by sequelize. Check it out :

on models/index.js: ( for connection to db )

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

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

module.exports = db;

On models/m_bank.js code :

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('m_bank', {
    bank: {
      type: DataTypes.STRING,
      allowNull: false,
      defaultValue: '',
      primaryKey: true
    },
    bank_name: {
      type: DataTypes.STRING,
      allowNull: true
    },
    address: {
      type: DataTypes.STRING,
      allowNull: true
    },
    branch: {
      type: DataTypes.STRING,
      allowNull: true
    },
    create_date: {
      type: DataTypes.DATE,
      allowNull: true
    },
    update_date: {
      type: DataTypes.DATE,
      allowNull: true
    }
  }, {
    tableName: 'm_bank',
    timestamps: false,
    schema: 'db_hrms'
  });
};

on controllers/m_bank.js

const M_Bank = require('../models').m_bank;

module.exports = {
  list(req, res) {
    return M_Bank
      .findAll()
      .then(M_Bank => res.status(200).send(M_Bank))
      .catch((error) => {
        console.log(error.toString());
        res.status(400).send(error)
      });
  },

  getById(req, res) {
    return M_Bank
      .findById(req.params.id)
      .then(M_Bank => {
        if (!M_Bank) {
          return res.status(404).send({ message: "M_Bank Not Found" });
        }
        return res.status(200).send(M_Bank);
      })
      .catch((error) => res.status(400).send(error));
  },

  add(req, res) {
    return M_Bank
      .findOrCreate({
        where: { bank: req.body.bank },
        defaults: {
          bank: req.body.bank,
          bank_name: req.body.bank_name,
          address: req.body.address,
          branch: req.body.branch
        }
      })
      .spread((M_Bank, created) => {
        return res.status(created === false ? 400 : 200).send({
          messsage: "Bank record " + (created === false ? "Already exists" : "successfully added")
        })
      })
      // .then((M_Bank) => { res.status(201).send(M_Bank) })
      // .catch((error) => res.status(400).send(error));
  },

  update(req, res) {
    return M_Bank
      .findById(req.params.id)
      .then(M_Bank => {
        if (!M_Bank) {
          return res.status(404).send({ message: "Bank Not Found" });
        }
        return M_Bank
          .update({
            bank: req.body.bank || M_Bank.bank,
            bank_name: req.body.bank_name || M_Bank.bank_name,
            address: req.body.address || M_Bank.address,
            branch: req.body.branch || M_Bank.branch
          })
          .then(() => res.status(200).send({
            message: "Bank successfully update"
          }))
          .catch((error) => res.status(400).send({
            message: "Bank Not Found"
          }));
      })
      .catch((error) => res.status(400).send({
        message: "No parameter for Bank ID"
      }));
  },

  delete(req, res) {
    return M_Bank
      .findById(req.params.id)
      .then((M_Bank) => {
        if (!M_Bank) {
          return res.status(404).send({ message: "M_Bank Not Found" });
        }
        return M_Bank
          .destroy()
          .then(() => res.status(204).send({
            message: "Bank record successfully delete"
          }))
          .catch((error) => res.status(400).send({
            message: "Bank Not Found"
          }));
      })
      .catch((error) => res.status(400).send(error));

  }
}

on config/config.json configuration code:

{
  "development": {
    "username": "tihagi",
    "password": "123456",
    "database": "db_tihagi",
    "host": "127.0.0.1",
    "dialect": "postgres"
  },
  "test": {
    "username": "tihagi",
    "password": "123456",
    "database": "db_tihagi",
    "host": "127.0.0.1",
    "dialect": "postgres"
  },
  "production": {
    "username": "tihagi",
    "password": "123456",
    "database": "db_tihagi",
    "host": "127.0.0.1",
    "dialect": "postgres"
  }
}

Hope this can help you.

Note: my db is postgres, please change as per your dialect db.

-Tihagi

Upvotes: 2

bereket gebredingle
bereket gebredingle

Reputation: 12996

Change your customer model to this one.

/* jshint indent: 2 */
const db = require('../../db/database')
const sequelize = db.sequelize

module.exports = function(sequelize, DataTypes) {

  var cust = sequelize.define('ms_customer', {
    id: {
      type: DataTypes.CHAR(10),
      allowNull: false,
      primaryKey: true
    },
    gender_id: {
      type: DataTypes.INTEGER(1),
      allowNull: true
    },
    status: {
       type: DataTypes.CHAR(1),
       allowNull: true
    }
  }, {
    tableName: 'ms_customer'
  });

 return cust;
};

Your query to

const customerModel = require('../../db/model/ms_customer')
//const cust = customerModel.cust .... you do not need this.

module.exports = {
    modelGetCustomerById : (param,req,res) => {
         customerModel.findAll({
             where: {
                 id: {
                     param
                 }
             }
         }).then(customer => {
             // console.log(customer)
             res.json(customer)
         })
   }
}

Upvotes: 0

margherita pizza
margherita pizza

Reputation: 7145

Possible reason could be that you didn't pass the model name correctly. What is the output of console.log(cust)

Upvotes: 0

Related Questions