User.hasMany 不是函数

问题描述 投票:0回答:1

我的数据库有用户和订单模型。但是当我启动脚本时抛出异常: User.hasMany 不是一个函数。

// ./models/user.js

const { Sequelize, DataTypes } = require('sequelize');
module.exports = (sequelize) => {
    const User = sequelize.define('User', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false
        }
    });
    return User;
};
// ./models/order.js

const { Sequelize, DataTypes } = require('sequelize');
const { User } = require('./user')

module.exports = (sequelize) => {
    const Order = sequelize.define('Order', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },
        name: {
          type: DataTypes.STRING
        },
        userId: {
            type: DataTypes.INTEGER,
            references: {
                model: User,
                key: 'id'
            }
        }
    });
    return Order;
};
// index.js

const User = require('./models/user');
const Order = require('./models/order');

User.hasMany(Order, { foreignKey: 'userId' });
Order.belongsTo(User, { foreignKey: 'userId' });
sequelize.sync()
    .then(() => {
        console.log('Database & tables created')
    });

我尝试在模型内部添加通信:

const { Sequelize, DataTypes } = require('sequelize');
const Order = require("./order");
module.exports = (sequelize) => {
    const User = sequelize.define('User', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false
        }
    });
    User.hasMany(Order, { foreignKey: 'userId' });
    return User;
};
const { Sequelize, DataTypes } = require('sequelize');
const { User } = require('./user')

module.exports = (sequelize) => {
    const Order = sequelize.define('Order', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },
        name: {
          type: DataTypes.STRING
        },
        userId: {
            type: DataTypes.INTEGER,
            references: {
                model: User,
                key: 'id'
            }
        }
    });
    Order.belongsTo(User, { foreignKey: 'userId' });
    return Order;
};

但那是另一个问题

(节点:9264)警告:在循环依赖中访问模块导出的不存在的属性“用户” (使用

node --trace-warnings ...
显示警告的创建位置) 执行(默认):SELECT 1+1 AS 结果

node.js sequelize.js telegraf
1个回答
0
投票

首先,您需要从模型模块中删除所有交叉引用:

order.js

//const { User } = require('./user')

userId: {
            type: DataTypes.INTEGER,
            references: {
                model: 'User',
                key: 'id'
            }
        }

其次,您需要注册模型,调用其构造函数并在那里传递

sequelize
实例,因为所有模型都作为构造函数导出,而不是作为现成的模型实例导出:

index.js

const User = require('./models/user')(sequelize);
const Order = require('./models/order')(sequelize);

User.hasMany(Order, { foreignKey: 'userId' });
Order.belongsTo(User, { foreignKey: 'userId' });
sequelize.sync()
    .then(() => {
        console.log('Database & tables created')
    });

请参阅我的其他答案以了解如何正确注册模型及其关联

© www.soinside.com 2019 - 2024. All rights reserved.