Sequelize中set与add方法报错:TypeError: Bar.setFoo is not a function
问题解决方法
你遇到的错误核心原因是:setFoo这类关联方法是模型实例的方法,不能直接用模型类(比如Bar)来调用。Sequelize的关联方法(setXxx、addXxx)都需要在具体的模型实例上执行,而不是模型本身。
下面是具体的修正步骤和代码:
1. 先获取对应模型的实例
你需要先查询到具体的Bar实例,才能调用setFoo;同理操作Baz时也要先拿到Bar实例。
2. 修正关联方法的调用逻辑
- 对于
Foo.hasOne(Bar)的关联,Bar实例会有setFoo方法,需要传入Foo的实例或者符合外键(这里是fooName)的值。 - 对于
Bar.hasMany(Baz)的关联,Bar实例的方法是addBaz(不是addBar,方法名是根据关联模型名生成的),需要传入Baz实例或者对应外键值。
3. 确保表结构同步
建议取消注释sequelize.sync({ force: true })(开发环境下),确保你的关联外键字段在数据库中正确创建。
修改后的完整代码
"use strict" const {Sequelize, DataTypes} = require('sequelize'); const sequelize = new Sequelize("node_test", "node", "****", { host: 'localhost', dialect: "mysql" }); const Foo = sequelize.define( 'Foo', { name: { type: DataTypes.STRING, unique: true, }, }, { timestamps: false, } ); const Bar = sequelize.define( 'Bar', { title: { type: DataTypes.STRING, unique: true, } }, { timestamps: false, } ); const Baz = sequelize.define( 'Baz', { summary: { type: DataTypes.STRING, }, }, { timestamps: false } ); // 关联定义保持不变 Foo.hasOne(Bar, { sourceKey: 'name', foreignKey: 'fooName' }); Bar.hasMany(Baz, { sourceKey: 'title', foreignKey: 'barTitle'}); async function a() { // 开发环境下同步表结构,确保外键存在 await sequelize.sync({ force: true }); // 先创建或查询到Foo实例(这里假设我们创建一个测试用的Foo) const fooInstance = await Foo.create({ name: 'TestFoo' }); // 查询或创建Bar实例 const barInstance = await Bar.create({ title: 'TestBar' }); // 使用Bar实例调用setFoo,传入Foo实例或者foo的name值(因为外键是fooName) await barInstance.setFoo(fooInstance); // 或者用外键值:await barInstance.setFoo('TestFoo'); // 创建Baz实例,然后用Bar实例调用addBaz const bazInstance = await Baz.create({ summary: 'TestBaz' }); await barInstance.addBaz(bazInstance); // 或者用外键值:await barInstance.addBaz({ barTitle: 'TestBar' }); }; a().catch(err => console.error(err));
补充说明
- 如果你的数据库中已经存在数据,不要用
force: true(会清空表),可以改成alter: true来同步结构。 setXxx用于一对一关联,会替换现有的关联;addXxx用于一对多关联,会添加新的关联(不会替换已有)。
内容的提问来源于stack exchange,提问作者sterban n
相关产品推荐
相关产品推荐

