【问题标题】:Sequelize: TypeError: User.hasMany is not a function续集:TypeError:User.hasMany 不是函数
【发布时间】:2018-05-12 07:00:27
【问题描述】:

我有这种奇怪的行为。 我有一个用户模型和一个客户模型。用户有很多客户。 我正在使用这个文档:http://docs.sequelizejs.com/manual/tutorial/associations.html

当我运行服务器时,Sequelize 抛出 TypeError: User.hasMany is not a function

节点版本: 8.9.1
方言: postgres
数据库版本: Postgres 10
续集版本: 4.22.15

以下文件都在同一个文件夹中

user.js 模型

const Sequelize = require('sequelize');
const db = require('../index.js'); //This is an instance of new Sequelize(...)

const tableName = 'users';

const User = db.define('user', {
  firstName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  lastName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  username: { //Username will be the email
    type: Sequelize.STRING(80),
    allowNull: false,
    unique: true,
    validate: {
      isEmail: true
    }
  },
  password: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  isAdmin: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
    defaultValue: false
  },
  isActive: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
    defaultValue: false
  }

}, { tableName });

module.exports = User;

client.js 模型

'use strict'

const Sequelize = require('sequelize');
const db = require('../index.js');

const instanceMethods = {
  toJSON() {
    const values = Object.assign({}, this.get());

    return values;
  },
};

const Client = db.define('clients', {
  ibid: {
    type: Sequelize.BIGINT,
    allowNull: true,
    defaultValue: null
  },
  firstName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  lastName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  agreementSigned: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
    defaultValue: false
  },
  totalBalance: {
    type: Sequelize.DECIMAL(11,2),
    allowNull: true,
    defaultValue: null
  },
  currentAllocation: {
    type: Sequelize.STRING,
    allowNull: true,
    defaultValue: null
  }

}, { instanceMethods });

module.exports = Client;

index.js 模型

'use strict';

const User = require('./user')
const Client = require('./client');

User.hasMany(Client);
Client.belongsTo(User);

module.exports = {User, Client};

【问题讨论】:

  • 在 user.js 中你没有导出用户 module.exports = User;
  • @Molda 对不起,我没有复制文件的最终版本,但是是的,我正在正确导出用户模型

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


【解决方案1】:

在 index.js 中, 您尚未导出已初始化的新 sequelize 实例,因此它对 client.js 和 user.js 不可用! define 函数作用于您创建的 sequelize 实例对象!

项目中还有一个循环依赖,可能会产生问题!

我尝试了您的代码并更改了结构,它现在可以工作了!也可能有其他结构,但这个对我有用!

1) 不要在 index.js 中创建新的 sequelize 实例,而是创建另一个文件作为 sequelize 实例的初始化!

sequelize_index.js(我已经使用这个文件来创建一个基础实例,然后在客户端和用户模型中都使用这个基础实例)

const Sequelize = require('sequelize');
const dbconfig=require('./dbconfig.json');

const sequelize = new Sequelize('postgres://' + dbconfig.USER + ":" +     dbconfig.PASSWORD + "@" + dbconfig.HOST + ":5432/" + dbconfig.DB, {
host: dbconfig.HOST,
dialect: dbconfig.DIALECT,
pool: {
    min: 0,
    max: 5,
    idle: 1000
     }
});

 module.exports={sequelize};

2) client.js 看起来像这样!

'use strict'
const Sequelize = require('sequelize');

const sequelize=require('./sequelize_index').sequelize;
const db = require('./index.js');

const instanceMethods = {
    toJSON() {
        const values = Object.assign({}, this.get());

        return values;
    },
};

const Client = sequelize.define('clients', {
    ibid: {
        type: Sequelize.BIGINT,
        allowNull: true,
        defaultValue: null
    },
    firstName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    lastName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    agreementSigned: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false
    },
    totalBalance: {
        type: Sequelize.DECIMAL(11,2),
        allowNull: true,
        defaultValue: null
    },
    currentAllocation: {
        type: Sequelize.STRING,
        allowNull: true,
        defaultValue: null
    }

}, { instanceMethods });

module.exports = Client;

3) 用户.js

const Sequelize = require('sequelize');
const sequelize=require('./sequelize_index').sequelize;
const db = require('./index.js'); //This is an instance of new Sequelize(...)

const tableName = 'users';

const User = sequelize.define('user', {
    firstName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    lastName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    username: { //Username will be the email
        type: Sequelize.STRING(80),
        allowNull: false,
        unique: true,
        validate: {
            isEmail: true
        }
    },
    password: {
        type: Sequelize.STRING,
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    isAdmin: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false
    },
    isActive: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false
    }

}, { tableName });

module.exports = User;

4) index.js

'use strict';
const sequelize = require('./sequelize_index').sequelize;
const User = require('./user')
const Client = require('./client');


User.hasMany(Client);
Client.belongsTo(User);

sequelize.sync({force: false}).then(function () {
    console.log("Database Configured");
});
module.exports = {User, Client};

运行 index.js 后,数据库就创建好了!

【讨论】:

  • 我很想知道任何其他结构来消除循环依赖!谢谢! :)
  • @Abhisek Yadav 感谢您的回复!我以前可以解决这个问题。我意识到在使用某些模型之前我必须要求我的数据库(我有一个使用用户的身份验证文件,而我之前没有包括数据库)。我不太喜欢这种方式,所以明天我会尝试你的方式,它看起来不错。问候!
猜你喜欢
  • 2019-12-20
  • 2017-05-25
  • 2018-05-21
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多