【问题标题】:define() is not a functiondefine() 不是函数
【发布时间】:2021-08-31 07:01:55
【问题描述】:

我一直在尝试与 Sequelize 建立关联,但无济于事,我不断收到 hasOne is not a function error。我了解到这可能是因为我的进口产品的循环依赖。所以我开始在我的index.js 文件中使用 Sequelize 实例并将该实例导入其他模型文件中:

index.js:

'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 = {};
const practAppt = require('./practAppt')
const practUser = require('./practUsers')

practAppt.hasOne(practUser, {foreignKey: "email"})
practUser.hasMany(practAppt, {foreignKey: "client"})

var sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: 'C:/backend/db.sqlite3'
});

//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 => {
    console.log("FILE", file)
    const model = require((path.join(__dirname, file)));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});




sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

practUsers.js

const Sequelize = require('sequelize')
const Op = Sequelize.Op
const db = require("./index")



const practUser = db.define("practUsers", {
    // attributes
    firstName: {
        type: Sequelize.STRING,
        allowNull: false
    },
    lastName: {
        type: Sequelize.STRING,
        allowNull: false
    },
    address: {
        type: Sequelize.STRING,
        allowNull: false
    },
    unit: {
        type: Sequelize.STRING,
        allowNull: false
    },
    city: {
        type: Sequelize.STRING,
        allowNull: false
    },
    province: {
        type: Sequelize.STRING,
        allowNull: false
    },
    postal_code: {
        type: Sequelize.STRING,
        allowNull: false
    },
    phoneNumber: {
        type: Sequelize.STRING,
        allowNull: false
    },
    email: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true
    },
    birthdate: {
        type: Sequelize.STRING,
        allowNull: false
    },
    healthCardNumber: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true
    },
    profession: {
        type: Sequelize.STRING,
        allowNull: false
    },
    designation: {
        type: Sequelize.STRING,
        allowNull: false
    },
    userType: {
        type: Sequelize.STRING,
        allowNull: false
    },
})

// automatically create the table with the model definition
//sequelize.sync()

// test the connections
  
module.exports = {practUser}

但现在它告诉我db.define 不是一个函数,即使我在index.js 中导出sequelize 我也会遇到同样的错误。如何正确创建关联?我应该在index.js 中创建它们对吗?还是没关系?文档在这方面似乎毫无用处。

【问题讨论】:

  • 你仍然有循环依赖。

标签: node.js express sequelize.js


【解决方案1】:

您从 index.js 导出的 db 对象没有 define 方法。你可能需要写:

const practUser = db.sequelize.define(....

【讨论】:

  • 我收到 Cannot read property 'define' of undefined 我不明白为什么没有导出实例
  • db 始终是一个空对象
  • 你有一些循环引用正在进行,所以你的 practUsers.js 在db 在 index.js 中完全定义之前执行
猜你喜欢
  • 2017-03-20
  • 2019-01-23
  • 2011-12-07
  • 1970-01-01
  • 2013-02-10
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多