【问题标题】:TypeError: Cannot read property 'findAll' of undefined (mariaDB, ExpressJs)TypeError:无法读取未定义的属性“findAll”(mariaDB,ExpressJs)
【发布时间】:2020-11-25 03:06:08
【问题描述】:

TypeError: 无法读取未定义的属性“findAll”

findAll 函数出错,但Connection 成功。
并且数据库也以managers的名称创建。


  • app.js
  • 型号
    • index.js
    • 玛丽亚
      • manager.model.js
    • www.js

models/index.js

const { Sequelize } = require('sequelize');

const manager = new Sequelize({
    dialect: 'mariadb',
    host: '127.0.0.1',
    port: '13306',
    username: 'xxx',
    password: 'xxx',
    database: 'test',
    timezone: 'Asia/Seoul'
});

require('./maria/manager.model')(manager);

module.exports=manager;

models/maria/manager.model.js

const { DataTypes } = require('sequelize');

module.exports = (sequelize) => {
     sequelize.define('manager', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        name: {
            allowNull: false,
            type: DataTypes.STRING,
        }
    }, {timestamps: true }).sync({force:false});
};

app.js

const express = require('express');
const app = express();

const db = require('./models');
console.log(`Checking database connection...`);

// It works!
db.authenticate().then(()=>{
  console.log('Database connection OK!');
});

// It makes error!
const find_test = db.manager.findAll();
console.log(find_test);

【问题讨论】:

  • 如错误所示,db.manager 未定义
  • 您的models/index.js 导出manager,而不是具有manager 属性的对象。你在哪里有const db = require('./models')db 已经是manager
  • @Phill const find_test = db.findAll(); 它会犯同样的错误

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


【解决方案1】:

首先,您的 manager 变量包含什么? 您的 manager 变量包含连接续集。您的目标是请求您的表manager,但您不能使用变量来实现这一点。因为他不包含表规范,而是数据库连接。

const { DataTypes } = require('sequelize');

module.exports = (sequelize) => {
     return sequelize.define('manager', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        name: {
            allowNull: false,
            type: DataTypes.STRING,
        }
    }, {timestamps: true });
};

在这个文件中,你需要返回你的表的定义。

const { Sequelize } = require('sequelize');

const manager = new Sequelize({
    dialect: 'mariadb',
    host: '127.0.0.1',
    port: '13306',
    username: 'xxx',
    password: 'xxx',
    database: 'test',
    timezone: 'Asia/Seoul'
});

const myTable = require('./maria/manager.model')(manager);

module.exports= {
  manager, myTable
};

在这个文件中,你需要将返回值存储在一个变量中。然后导出它。

const express = require('express');
const app = express();

const { manager, myTable }= require('./models');
console.log(`Checking database connection...`);

// It works!
manager.authenticate().then(()=>{
  console.log('Database connection OK!');
});


const find_test = myTable.findAll();
console.log(find_test);

最后在下一个文件中,导入新导出的变量!享受吧!

【讨论】:

    【解决方案2】:
    • app.js
    • 续集
      • 型号
        • manager.model.js
      • index.js

    app.js

    const maria = require('./sequelize');
    const { models } = require('./sequelize');
    
    console.log(`Checking database connection...`);
    maria.authenticate()
        .then(()=>{
          console.log('Database connection OK!');
        });
    
    const test = models.manager.findOne()
    
    

    续集/index.js

    const { Sequelize } = require('sequelize');
    
    const maria = new Sequelize({
        dialect: 'mariadb',
        host: '127.0.0.1',
        port: '13306',
        username: 'xxxx',
        password: 'xxxx',
        database: 'test',
        timezone: 'Asia/Seoul'
    });
    
    require('./models/manager.model')(maria)
    
    module.exports=maria;
    

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 2016-09-07
      • 2020-01-23
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多