TypeError:无法读取未定义的属性“findAll”(mariaDB,ExpressJs)

Posted

技术标签:

【中文标题】TypeError:无法读取未定义的属性“findAll”(mariaDB,ExpressJs)【英文标题】:TypeError: Cannot read property 'findAll' of undefined (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(); 它会犯同样的错误 【参考方案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;

【讨论】:

以上是关于TypeError:无法读取未定义的属性“findAll”(mariaDB,ExpressJs)的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取未定义的属性(读取“公会”)

(Discord.js)TypeError:无法读取未定义的属性“添加”

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

TypeError:无法读取未定义的属性(读取“名称”)

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

TypeError:无法读取未定义的属性(读取“问题”)