首页 > 解决方案 > 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);
  })
}

标签: javascriptnode.jssequelize.js

解决方案


首先,我建议您model name在模型定义中选择时要非常小心:sequelize.define(modelName, attributes, options). Sequelize 会自动为您生成复数,因此定义表格的一个好方法是始终使用单数,但当然这完全是可选的。这意味着如果您使用 as model namerole而不是roles,则表名将roles由 Sequelize 自动设置为。

第二个建议是不要在同一个模型名称中使用大写,因为当您必须处理自动创建的外键并希望通过 访问它们时object.property,您将不得不使用大写或小写,具体取决于您定义名称的方式。因此,例如,如果您companyId在表中有 a ,如果您的公司表的模型名称写为并且如果写为 ,则Users必须调用它才能获取它。user.CompanyIdCompanyuser.companyIdcompany

最后,回答您的主要问题,我建议您查看 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)


推荐阅读