无法读取未定义的续集Express JS的属性'findAll'

时间:2018-11-09 10:01:10

标签: javascript mysql node.js express sequelize.js

使用sequelize自动时,我的代码有问题。 问题是如何将sequelize模型连接到DB.js上的数据库设置,以便我们可以使用findall函数或其他任何函数

型号:

/* 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连接:

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
}

查询:

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

控制器:

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

为什么我总是出错

  

无法读取未定义的属性'findAll'

请帮助。

3 个答案:

答案 0 :(得分:1)

我在我的项目上运行了没有错误的代码,该代码通过sequelize-auto重塑并通过sequelize连接。检查一下:

在models / index.js上:(用于连接到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;

在models / m_bank.js代码上:

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

在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));

  }
}

上config / config.json配置代码:

{
  "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"
  }
}

希望这可以为您提供帮助。

注意:我的数据库是postgres,请根据您的方言数据库进行更改。

-Tihagi

答案 1 :(得分:0)

可能的原因可能是您没有正确传递模型名称。 package.json

的输出是什么

答案 2 :(得分:0)

将您的客户模型更改为此。

/* 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;
};

您的查询

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