javascript - Cannot read property 'findAll' of undefined sequelize express JS - Stack Overflow

I have a problem with my code when using sequelize auto.the problem is how to connect sequelize model

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..

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..

Share Improve this question edited Nov 9, 2018 at 10:53 Prashant Gupta 7901 gold badge8 silver badges27 bronze badges asked Nov 9, 2018 at 10:01 Agung hallman malikiAgung hallman maliki 933 silver badges11 bronze badges 1
  • Hey Man, can I have your kind feedback on my answer ? Thanks, – bereket gebredingle Commented Nov 11, 2018 at 3:58
Add a ment  | 

3 Answers 3

Reset to default 2

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

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

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)
         })
   }
}

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745321901a4622479.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信