Javascript Sequelize:addUser不是一个函数

Javascript Sequelize:addUser不是一个函数,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我正在学习使用Sequelize,我被难住了。我有两个模型,User和Salon,它们之间有一个N:M关系,由一个辅助表UsersSalons来调节(因此用户可以管理许多沙龙,例如特许经营,或者沙龙可以由许多员工管理) 创建新沙龙时,我的目的是将登录用户与之关联。但是,当我将新沙龙保存在数据库中时,它永远不会与用户关联,并返回以下错误: ERROR PUT /salons Error: TypeError: salon.addUser is not a function 在谷歌上搜索时,出现此

我正在学习使用Sequelize,我被难住了。我有两个模型,User和Salon,它们之间有一个N:M关系,由一个辅助表UsersSalons来调节(因此用户可以管理许多沙龙,例如特许经营,或者沙龙可以由许多员工管理)

创建新沙龙时,我的目的是将登录用户与之关联。但是,当我将新沙龙保存在数据库中时,它永远不会与用户关联,并返回以下错误:

ERROR PUT /salons Error: TypeError: salon.addUser is not a function
在谷歌上搜索时,出现此错误的常见原因似乎是试图将函数应用于整个模型类,而不是它的实例,但这不是这里发生的情况

以下是
PUT/salones
路线:

router.put('/',checkLoggedIn,(req,res,next)=>{
const user=user.findOne({其中:{id:req.user[0].id})
.然后(()=>
沙龙。创造({
名称:req.body.name,
街道:req.body.street,
编号:req.body.number,
zipcode:req.body.zipcode,
城镇:req.body.town,
省:req.body.PROVICE,
addressComplements:req.body.addressComplements,
phoneNumber:req.body.phoneNumber,
})
)
.然后((沙龙)=>{
控制台日志(沙龙)
salon.addUser(user)//这里是发生错误的地方
})
.then((沙龙)=>res.status(200).json(沙龙))
.catch((err)=>next(新错误(err)))
})
以防万一,以下是用户和沙龙模型,以及如何创建UsersSalons表:

“严格使用”
const{Model}=require('sequelize')
module.exports=(sequelize,数据类型)=>{
班级沙龙扩展模式{
/**
*用于定义关联的助手方法。
*此方法不是Sequelize生命周期的一部分。
*`models/index`文件将自动调用此方法。
*/
静态助理(模型){
Salon.belongsToMany(models.User、{
通过“UsersSalons”,
比如:“沙龙”,
外键:“salonId”,
otherKey:'userId',
})
}
}
发廊(
{
名称:{type:DataTypes.STRING,allowNull:false,unique:true},
街道:{type:DataTypes.STRING,allowNull:false},
编号:{type:DataTypes.STRING,allowNull:false},
zipcode:{type:DataTypes.STRING,allowNull:false},
城镇:{type:DataTypes.STRING,allowNull:false},
省:{type:DataTypes.STRING,allowNull:false},
addressComplements:DataTypes.STRING,
电话号码:{
类型:DataTypes.STRING,
allowNull:错,
},
},
{
续集,
型号名称:“沙龙”,
}
)
回程沙龙
}
“严格使用”
const{Model}=require('sequelize')
module.exports=(sequelize,数据类型)=>{
类用户扩展模型{
/**
*用于定义关联的助手方法。
*此方法不是Sequelize生命周期的一部分。
*`models/index`文件将自动调用此方法。
*/
静态助理(模型){
用户:belongtomany(模特沙龙、{
通过“UsersSalons”,
as:'用户',
foreignKey:'userId',
otherKey:'salonId',
})
}
}
User.init(
{
电邮:{
类型:DataTypes.STRING,
验证:{isEmail:true},
allowNull:错,
独一无二:没错,
},
名字:{type:DataTypes.STRING,allowNull:false},
lastName:{type:DataTypes.STRING,allowNull:false},
isActive:{type:DataTypes.BOOLEAN,defaultValue:false},
密码:{type:DataTypes.STRING},
确认代码:DataTypes.STRING,
},
{
续集,
modelName:'用户',
}
)
返回用户
}
“严格使用”
module.exports={
up:async(查询接口,续集)=>{
返回queryInterface.createTable('UsersSalons'{
createdAt:{allowNull:false,类型:Sequelize.DATE},
updatedAt:{AllowFull:false,类型:Sequelize.DATE},
userId:{type:Sequelize.INTEGER,primaryKey:true},
salonId:{type:Sequelize.INTEGER,primaryKey:true},
})
},
向下:异步(查询接口,续集)=>{
等待queryInterface.dropTable('UsersSalons')
},
}
编辑:在尝试了阿纳托利的建议之后,仍然有错误发生。以下是
PUT/salones
路线的更新代码和输出:

router.put('/',checkLoggedIn,(req,res,next)=>{
const user=user.findOne({其中:{id:req.user[0].id})
.然后(()=>{
返回沙龙({
名称:req.body.name,
街道:req.body.street,
编号:req.body.number,
zipcode:req.body.zipcode,
城镇:req.body.town,
省:req.body.PROVICE,
addressComplements:req.body.addressComplements,
phoneNumber:req.body.phoneNumber,
})
})
.然后((沙龙)=>{
log(`salon创建后输出:${salon}`)
return salon.addUser(用户)
})
.then((沙龙)=>res.status(200).json(沙龙))
.catch((err)=>next(新错误(err)))
})

您在
关联中混淆了别名。您应该为与作为第一个参数传递给
belongToMany
的模型相关的别名命名:

Salon.belongsToMany(models.User, {
        through: 'UsersSalons',
        as: 'user',
        foreignKey: 'salonId',
        otherKey: 'userId',
      })
User.belongsToMany(models.Salon, {
        through: 'UsersSalons',
        as: 'salon',
        foreignKey: 'userId',
        otherKey: 'salonId',
      })
另外,您没有返回find
user
,也没有从
then
handler创建
salon
实例。应该是这样的:

.then((user) =>
      return Salon.create({
        name: req.body.name,
        street: req.body.street,
        number: req.body.number,
        zipcode: req.body.zipcode,
        town: req.body.town,
        province: req.body.province,
        addressComplements: req.body.addressComplements,
        phoneNumber: req.body.phoneNumber,
      }).then((salon) => {
        console.log(salon)
        salon.addUser(user.id)
        return salon
     })
    )
    .then((salon) => res.status(200).json(salon))
    .catch((err) => next(new Error(err)))

根据阿纳托利的答案找到了解决方案,但更简单。如果我们在
req.user[0]
中有用户ID,并且足以将我们新的
salon
与之关联,我们就不需要在数据库中再次搜索该用户

这将是最后一段代码:

router.put('/',checkLoggedIn,(req,res,next)=>{
沙龙。创造({
名称:req.body.name,
街道:req.body.street,
编号:req.body.number,
zipcode:req.body.zipcode,
城市:req.bo
.then((user) =>
      return Salon.create({
        name: req.body.name,
        street: req.body.street,
        number: req.body.number,
        zipcode: req.body.zipcode,
        town: req.body.town,
        province: req.body.province,
        addressComplements: req.body.addressComplements,
        phoneNumber: req.body.phoneNumber,
      }).then((salon) => {
        console.log(salon)
        salon.addUser(user.id)
        return salon
     })
    )
    .then((salon) => res.status(200).json(salon))
    .catch((err) => next(new Error(err)))