简体   繁体   中英

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM