Node.js ';as';必须为多对多自关联定义错误,每当我尝试在2个模型之间创建多对多关联时

Node.js ';as';必须为多对多自关联定义错误,每当我尝试在2个模型之间创建多对多关联时,node.js,sequelize.js,Node.js,Sequelize.js,我正在关注Sequelize关于如何创建多对多关系的文档,但是,我经常遇到以下错误: 'as' must be defined for many-to-many self-associations 即使我遵循这些文件- 我有两个模型,用户和服务器,我尝试定义如下关系: let User = require('./models/User'); let Server = require('./models/User'); User.belongsToMany(Server, { through:

我正在关注Sequelize关于如何创建多对多关系的文档,但是,我经常遇到以下错误:

'as' must be defined for many-to-many self-associations
即使我遵循这些文件-

我有两个模型,用户和服务器,我尝试定义如下关系:

let User = require('./models/User');
let Server = require('./models/User');

User.belongsToMany(Server, { through: 'Server_User' });
Server.belongsToMany(User, { through: 'Server_User' });
但是我得到了以下错误:
'as'必须为多对多自关联定义

用户:

服务器:

let Sequelize = require('sequelize');
let sequelize = require('../controllers/DatabaseController');

let Server = sequelize.define('server', {
    id: {
        primaryKey: true,
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
    },
    user_id: {
        type: Sequelize.INTEGER,
        allowNull: false,
    },
    name: {
        type: Sequelize.STRING,
        allowNull: false
    },
    thumbnail: {
        type: Sequelize.STRING(1400),
        allowNull: false,
    },
    endpoint: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4,
        allowNull: false,
    },
    rooms: {
        type: Sequelize.JSON,
        allowNull: false,
        defaultValue: [{ name: 'General', history: []}]
    }
})

module.exports = Server;
它适用于
“sequelize”:“^5.21.3”
。该错误可能由其他代码引起。以下是一个完整的工作示例:

/models/User.ts

从'../../../db'导入{sequelize};
从“Sequelize”导入Sequelize;
让User=sequelize.define('User'{
身份证:{
primaryKey:没错,
类型:Sequelize.INTEGER,
自动递增:真,
allowNull:错,
},
用户名:{
类型:Sequelize.STRING,
allowNull:错,
},
密码:{
类型:Sequelize.STRING,
allowNull:错,
},
电邮:{
类型:Sequelize.STRING,
allowNull:错,
},
});
导出默认用户;
/models/Server.ts

从'../../../db'导入{sequelize};
从“Sequelize”导入Sequelize;
让Server=sequelize.define('Server'{
身份证:{
primaryKey:没错,
类型:Sequelize.INTEGER,
自动递增:真,
allowNull:错,
},
用户id:{
类型:Sequelize.INTEGER,
allowNull:错,
},
姓名:{
类型:Sequelize.STRING,
allowNull:错,
},
缩略图:{
类型:Sequelize.STRING(1400),
allowNull:错,
},
终点:{
类型:Sequelize.UUID,
defaultValue:Sequelize.UUIDV4,
allowNull:错,
},
房间:{
类型:Sequelize.JSON,
allowNull:错,
默认值:[{name:'General',history:[]}],
},
});
导出默认服务器;
/models/index.ts

从“/User”导入用户;
从“./Server”导入服务器;
(用户如有).belongToMany(服务器,{通过:'Server\u User'});
(与任何服务器一样)。belongToMany(用户,{通过:'Server\u User'});
导出{用户,服务器};
index.ts

从“/models”导入{User,Server};
从“../../db”导入{sequelize};
从“冒牌货”进口冒牌货;
(异步函数测试(){
试一试{
wait sequelize.sync({force:true});
等待(任何用户)。批量创建(
[
{
id:1,
用户名:faker.name.findName(),
密码:faker.internet.password(),
电子邮件:faker.internet.email(),
服务器:[
{user_id:1,name:faker.name.findName(),缩略图:faker.random.image(),端点:faker.random.uuid(),
{user_id:1,name:faker.name.findName(),缩略图:faker.random.image(),端点:faker.random.uuid(),
],
},
{
id:2,
用户名:faker.name.findName(),
密码:faker.internet.password(),
电子邮件:faker.internet.email(),
服务器:[
{user_id:2,name:faker.name.findName(),缩略图:faker.random.image(),端点:faker.random.uuid(),
],
},
],
{include:[服务器]},
);
}捕获(错误){
console.log(错误);
}最后{
等待续集。关闭();
}
})();
测试功能的执行结果:

执行(默认):如果存在“服务器\用户”级联,则删除表;
执行(默认):如果存在“服务器”级联,则删除表;
执行(默认):如果存在“用户”级联,则删除表;
执行(默认):如果存在“用户”级联,则删除表;
执行(默认):创建表,如果不存在“用户”(“id”序列,“用户名”VARCHAR(255)不为空,“密码”VARCHAR(255)不为空,“电子邮件”VARCHAR(255)不为空,主键(“id”);
执行(默认):选择i.relname作为名称,ix.indprimary作为主要,ix.indunique作为唯一,ix.indkey作为indkey,array_agg(a.attnum)作为列索引,array_agg(a.attname)作为列名称,pg_get_indexdef(ix.indexrelid)作为pg_class t,pg_class i,pg_index ix的定义,pg_属性a,其中t.oid=ix.indrelid和i.oid=ix.indexrelid和a.attrelid=t.oid和t.relkind='r'和t.relname='user'按i.relname分组,ix.indexrelid,ix.indprimary,ix.indisunique,ix.indkey按i.relname排序;
执行(默认):如果存在“服务器”级联,则删除表;
执行(默认):创建表,如果不存在“服务器”(“id”序列,“user_id”整数不为空,“name”VARCHAR(255)不为空,“缩略图”VARCHAR(1400)不为空,“endpoint”UUID不为空,“rooms”JSON不为空默认“[{”name:“General”,“history:[]}]”,主键(“id”);
执行(默认):选择i.relname作为名称,ix.indprimary作为主要,ix.indunique作为唯一,ix.indkey作为indkey,array_agg(a.attnum)作为列索引,array_agg(a.attname)作为列名称,pg_get_indexdef(ix.indexrelid)作为pg_class t,pg_class i,pg_index ix的定义,pg_属性a,其中t.oid=ix.indrelid和i.oid=ix.indexrelid和a.attrelid=t.oid和t.relkind='r'和t.relname='server'按i.relname分组,ix.indexrelid,ix.indprimary,ix.indisunique,ix.indkey按i.relname排序;
执行(默认):如果存在“服务器\用户”级联,则删除表;
执行(默认):如果不存在“Server_User”(“userId”整数在更新级联上的删除级联上引用“User”(“id”),“serverId”整数在更新级联上的删除级联上引用“Server”(“id”),则创建表,主键(“userId”,“serverId”);
执行(默认):选择i.relname作为名称,ix.indprimary作为主要,ix.indunique作为唯一,ix.indkey作为indkey,array_agg(a.attnum)作为列索引,array_agg(a.attname)作为列名称,pg_get_indexdef(ix.indexrelid)作为pg_class t,pg_class i,pg_index ix的定义,pg_属性a,其中t.oid=ix.indrelid和i.oid=ix.indexrelid和a.attrelid=t.oid和t.relkind='r'和t.relname='Server_User'按i分组
let Sequelize = require('sequelize');
let sequelize = require('../controllers/DatabaseController');

let Server = sequelize.define('server', {
    id: {
        primaryKey: true,
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
    },
    user_id: {
        type: Sequelize.INTEGER,
        allowNull: false,
    },
    name: {
        type: Sequelize.STRING,
        allowNull: false
    },
    thumbnail: {
        type: Sequelize.STRING(1400),
        allowNull: false,
    },
    endpoint: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4,
        allowNull: false,
    },
    rooms: {
        type: Sequelize.JSON,
        allowNull: false,
        defaultValue: [{ name: 'General', history: []}]
    }
})

module.exports = Server;