javascript - user.setRole 不是使用 sequlize postgres 的函数
问题描述
我在 sequelize 的关联中遇到问题
我的数据已保存在数据库中,但未保存角色
我使用 postgres 进行注册,但面临未定义 setRole 的问题
我的代码是
Auth_User.js 是登录和注册用户的模型,我们在此文件中创建关联
import Sequelize from "sequelize";
import { sequelize } from "../Database/database";
const Auth_User = sequelize.define("authUsers", {
userName: {
type: Sequelize.STRING,
},
email: {
type: Sequelize.STRING,
},
password: {
type: Sequelize.STRING,
},
});
Auth_User.associate = function(models) {
Auth_User.belongsToMany(models.Role, { through: 'user_roles', foreignKey: 'userId', otherKey: 'roleId'});
};
export default Auth_User;
Role.js 在这个文件中我们创建了一个角色模型,我们有管理员和用户
import Sequelize from "sequelize";
import { sequelize } from "../Database/database";
const Role = sequelize.define('roles', {
id: {
type: Sequelize.INTEGER,
primaryKey: true
},
name: {
type: Sequelize.STRING
}
});
Role.associate = function(models) {
Role.belongsToMany(models.Auth_User, { through: 'user_roles', foreignKey: 'roleId', otherKey: 'userId'})
};
export default Role;
知道 signup.js 在这里我们创建注册我们在这个文件中面临的问题在这里产生问题 user.setRole 不是一个函数
import Auth_User from '../Model/auth.model';
import Role from '../Model/role.model';
var bcrypt = require('bcryptjs');
var jwt = require('jsonwebtoken');
var db= require('../Database/database')
const Op = db.Sequelize.Op;
export const signup = (req, res) => {
// Save Auth_User to Database
console.log("Processing func -> SignUp");
Auth_User.create({
userName: req.body.userName,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 8)
}).then(user => {
Role.findAll({
where: {
name: {
[Op.or]: req.body.roles.map(role => role.toUpperCase())
}
}
}).then(roles => {
console.log(user)
user.setRole(roles).then(() => {
res.send("User registered successfully!");
});
}).catch(err => {
res.status(500).send("Error -> " + err);
});
}).catch(err => {
res.status(500).send("Fail! Error -> " + err);
})
}
解决方案
首先,我建议您model name
在模型定义中选择时要非常小心:sequelize.define(modelName, attributes, options)
. Sequelize 会自动为您生成复数,因此定义表格的一个好方法是始终使用单数,但当然这完全是可选的。这意味着如果您使用 as model namerole
而不是roles
,则表名将roles
由 Sequelize 自动设置为。
第二个建议是不要在同一个模型名称中使用大写,因为当您必须处理自动创建的外键并希望通过 访问它们时object.property
,您将不得不使用大写或小写,具体取决于您定义名称的方式。因此,例如,如果您companyId
在表中有 a ,如果您的公司表的模型名称写为并且如果写为 ,则Users
必须调用它才能获取它。user.CompanyId
Company
user.companyId
company
最后,回答您的主要问题,我建议您查看 Sequelize 的官方文档,了解添加到实例的特殊方法/混合(https://sequelize.org/master/manual/assocs.html#special-methods-mixins- added-to-instances),您将在其中找到所有不同的组合,具体取决于关联。在您的特定情况下,对于belongsToMany
关联,必须使用复数形式使用其特殊方法。在你的情况下,它应该是user.setRoles(roles)
. 但是,如果您更喜欢使用 ,这不适用,add method
它可以用作user.addRole(roles)
或user.addRoles(roles)
推荐阅读
- swift - 取消嵌套的组合发布者
- arrays - 用于填充工作表上的多个列的数组
- push-notification - 如何使用 FCM 仅向使用主题的离线设备发送推送通知?
- javascript - 卖家和城市的 v-model 表单字段为空
- c# - MS Test 单元测试框架不会命中它的构造函数
- python-3.x - 如何使用 matplotlib python 绘制百分比值
- apache-superset - Apache Superset 永久删除表名
- greenplum - 绿梅 | 备份 | 错误=>错误消息:5:写入错误(SQLSTATE 22P04)
- android - 中间有中断的滑块(离散)用于本机反应
- php - 用户登录后 Wordpress 内存超出