续集上的belongsToMany会自动创建新的连接表吗?

2024-03-04

我对这个续集很陌生。我尝试使用belongsToMany通过UserPermissions在用户和权限之间关联模型,这是我的代码。

-- 用户.js

const bcrypt = require('bcrypt');
const config = require('../config/general');

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', {
        email: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true,
            validate: {
                isLowercase: true,
                notEmpty: true,
                isEmail: true
            }
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true,
            validate: {
                isLowercase: true,
                notEmpty: true,
                min: 3
            }
        },
        salt: {
            type: DataTypes.STRING,
            allowNull: true
        },
        password: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                notEmpty: true
            }
        },
    }, {
        underscored: true,
        classMethods: {
            associate: (models) => {
                User.belongsToMany(models.Permission, {
                    through: 'UserPermissions', 
                    foreignKey: 'user_id'
                });
            },
            validPassword: (password, passwd, done) => {
                const tmppass = password + config.secret;
                bcrypt.compare(tmppass, passwd, (err, isMatch) => {
                    if (err) return done(err);
                    return done(null, isMatch);
                });
            }
        }
    });

    User.beforeCreate( (user, option, done) => {
        bcrypt.genSalt(SALT_WORK_FACTOR, (err, salt) => {
            if (err) return done(err);
            const tmppass = user.password + config.secret;
            bcrypt.hash(tmppass, salt, (err, hash) => {
                if (err) return done(err);
                user.salt       = salt;
                user.password   = hash;
                return done(null, user);
            });
        });
    });

    return User;
};

-- 权限.js

module.exports = (sequelize, DataTypes) => {
    const Permission = sequelize.define('Permission', {
        name: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                notEmpty: true
            }
        },
        slug: {
            type: DataTypes.STRING,
            validate: {
                isLowercase: true
            }
        },
        description: {
            type: DataTypes.TEXT
        }
    }, {
        underscored: true,
        classMethods: {
            associate: (models) => {
                Permission.belongsToMany(models.User, { 
                    through: 'UserPermissions', 
                    foreignKey: 'permission_id'
                });
            }
        }
    });

    return Permission;
};

根据sequelize文档关于belongsToMany的here http://docs.sequelizejs.com/manual/tutorial/associations.html#belongs-to-many-associations,belongsToMany 将创建一个新模型,该模型链接到您加入的任何模型,对吧。

这将创建一个名为 UserProject 的新模型,具有等效的外键 projectId 和 userId。属性是否为驼峰式取决于表连接的两个模型(在本例中为 User 和 Project)。Sequelize 属于多个 http://docs.sequelizejs.com/manual/tutorial/associations.html#belongs-to-many-associations

但是当我尝试使用它并迁移它时sequelize-cli,我没有看到任何已创建的联接表。这Users表创建完成后,权限表已创建,但是用户权限未创建表。我在这里错过了什么吗?或者我的代码有问题?

我在用着postgres方言,"pg": "^6.4.0" and "sequelize": "^4.3.1"

哦,是的,我真的很抱歉我的英语,我的英语不太好。


回答你的问题(很多年后):

文档可能告诉您执行此操作以创建连接表:

在您的用户关联中:

User.belongsToMany(models.Permission, {
                    through: 'UserPermissions', 
                    foreignKey: 'user_id'
                });

在您的权限关联中:

Permission.belongsToMany(models.User, { 
                    through: 'UserPermissions', 
                    foreignKey: 'permission_id'
                });

文档中未提及的过程部分是如何实际创建您在数据库中使用的表。要在数据库中创建这些函数使用的表,请使用以下代码创建迁移:

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('UserPermissions', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      permission_id: {
        type: Sequelize.INTEGER,
        references: {
          model: 'Permissions',
          key: 'id',
          as: 'permission_id'
        }
      },
      user_id: {
        type: Sequelize.INTEGER,
        references: {
          model: 'Users',
          key: 'id',
          as: 'user_id'
        }
      },
      createdAd: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    })
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('UserPermissions')
  }
}

使用 Sequelize CLI 将为您生成大部分代码。请注意,model下的对象属性references是 postgres 中的表名(嗯,这对我有用)。

EDIT:

另请注意,through属性应该是一个模型,所以:

through: models.UserPermission

并创建相关模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

续集上的belongsToMany会自动创建新的连接表吗? 的相关文章

  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • 使用nodegit切换分支/标签

    我整个早上都在尝试打开现有的存储库并使用 nodegit 更改分支或标签 文档内容很丰富 但似乎已经过时了 关于我做错了什么有什么想法吗 var NodeGit require nodegit var open NodeGit Reposi
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • Babel 7 Jest Core JS“TypeError:wks不是函数”

    将我的项目升级到 Babel 7 后 通过 Jest 运行测试会抛出以下错误 测试在 Babel 6 中运行没有任何问题 但在 Babel 7 中失败并出现以下错误 TypeError wks is not a function at Ob
  • 如何在react-native中获取Text组件的onPress值

    我是一名新的 React Native 开发人员 我想使用 onPress 获取 Text 组件的值并将其传递给函数
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • node.js 本身还是 nginx 前端来提供静态文件?

    是否有更快的基准或比较 将 nginx 放在节点前面并让它直接提供静态文件或仅使用节点并使用它提供静态文件 nginx 解决方案似乎对我来说更易于管理 有什么想法吗 我不得不不同意这里的答案 虽然 Node 可以做得很好 但如果配置正确 n
  • 无法运行 npm install

    In here http devdocs magento com guides v2 0 frontend dev guide css topics css debug html它说要跑npm install 但是当我运行时出现此错误sud
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 为什么在 Internet Explorer 中访问 localStorage 对象会引发错误?

    我正在解决一个客户端问题 Modernizr 意外地没有检测到对localStorageInternet Explorer 9 中的对象 我的页面正确使用 HTML 5 文档类型 并且开发人员工具报告该页面具有 IE9 的浏览器模式和 IE
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux

随机推荐

  • 使用自定义 Maven 插件“无法设置 org.eclipse.aether.spi.log.Logger”

    我写了一个小的自定义 Maven 插件 它运行良好 大多数时候 使用它时 它被配置为在测试阶段运行 并且我看到它正在执行 没有问题 现在问题来了 当我这样做时mvn 干净安装 or mvn 干净部署在使用该插件的项目中 它失败并显示一条我无
  • 加密 AES/CBC/PKCS7Padding

    帮我加密一下AES CBC PKCS7Padding 下面是我的解密代码AES CBC PKCS7 它正在工作 但是当我加密一些字符串并从我自己解密时 这是错误的 下面我添加代码来加密和解密 AES CBC PKCS7Padding NSD
  • 在 ZF2 控制器中获取请求授权标头

    我正在使用 ZF2 出于某种原因 我可以获取我发送的所有标头 授权标头除外 就像它被过滤掉一样 我试图获取控制器中的所有标头 如下所示 public function createAction data request this gt re
  • SSAS Cube 处理日志

    SSAS立方体在哪里加工 不是错误 不是飞行记录器 日志存储了吗 我们有一个运行 SQL Server Analysis Services 命令的 SQL 代理作业 其中有一些 DMX 处理每个维度 然后处理多维数据集数据库 包含两个多维数
  • 通过 testcafe-browser-tools 将自定义参数传递到 Chrome 二进制文件时,无头运行 testcafe

    在 Vagrant VM 中运行 testcafe 即mostly在职的 但是 Chrome 在启用硬件加速的环境中无法正常启动 因此我必须使用命令行标志来启动它 disable gpu 我利用 testcafe browser tools
  • 如何在webapi上传中获取多部分文件的流?

    我需要使用流 Azure Blob 存储 上传文件 但无法找到如何从对象本身获取流 请参阅下面的代码 我是 WebAPI 的新手 并且使用过一些示例 我正在获取文件和文件数据 但对于我的上传方法来说 它的类型不正确 因此 我需要将其获取或转
  • 将java程序编译为可执行文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何为 Java 程序创建 exe https stackoverflow com questions 516399 how do i create an exe for a java program
  • Xpath 表达式

    我需要获得的价值
  • 无法访问复制到 /var/www/ 或其他文件夹中的 php 文件

    我使用的是带有 LAMP 设置的 Ubuntu 12 10 我将 Windows PC 上的 xampp htdocs 中包含项目文件 php html css 的子目录复制到我的 ubuntu 的 var www 中 但是 当我从浏览器访
  • reinterpret_cast 与 c 风格强制转换 [重复]

    这个问题在这里已经有答案了 可能的重复 c 风格强制转换与reinterpret cast https stackoverflow com questions 8427107 c style cast vs reinterpret cast
  • Tridion 命令扩展如何找到它扩展的命令?

    Tridion 的用户界面允许您扩展特定的命令 这是修改某些现有命令的行为的好方法 在编辑器的配置文件中 这是通过如下部分完成的
  • 通过反射获取枚举值

    我试图在运行时循环并打印给定枚举类的所有枚举值 但我似乎只能返回与值相关的常量 大多数解决方案都指向使用 getEnumConstants values 或 valueOf 但我无法让它们按预期工作 我能找到的最接近的问题是通过反射获取en
  • Android VOIP SipException:无法创建 SipSession

    我正在尝试使用 Android 3 1 上内置的 SIP 运行 VOIP 呼叫 我有物理平板电脑设备 galaxy Tab 10 1 为了测试目的 我创建了一个项目SipDemo 示例 http developer android com
  • NotYetImplemented 错误 ng2-charts

    从 utils js 收到消息 NotYetImplemented 的错误 我在使用nodejs服务器时收到错误 这个错误到底意味着什么 当我使用 ngserve 时 没有这样的错误 我正在使用 ng2 charts 模块中的折线图 完整的
  • 如何检索从 SQL Server 到 VB.NET 受影响的行数?

    基本上 我通过运行时检索程序中的所有数据 我想知道如何检索更新后受影响的行数 以便我可以通过 VB NET 提示用户相关信息 我实际上正在做的是 更新后 如果没有其他行更新 则用户无法再单击按钮 通过使用执行非查询 http msdn mi
  • 子项在父视图之外不可点击

    我创建了一个带有标记的地图视图 看下面这张图 Grandparent是一个填充视图 Parent是我的MarkerView Child是一个可点击的标记 父级有clipChildren false 因此子级是可见的 我的问题是孩子们是可点击
  • 如何在 ASP.NET MVC 区域中的 Web 窗体中使用母版页

    我已将 MVC 区域添加到现有的 Web 窗体项目中 我想在 MVC 项目的所有视图中使用母版页 我不明白我应该如何引用 MVC 区域内的 WebForms 的 MasterPage 我读过这两篇文章 http www hanselman
  • Mercurial 变基场景

    我读过变基项目 http mercurial selenic com wiki RebaseProject页面并尝试了一个不平凡的例子 不是对一个完整的分支进行变基 和这个案例很相似重新建立 D 基础 我场景 B 的情况 这是 rebase
  • Android:如何在onStop之后返回具有“noHistory”属性的Activity?

    我正在寻找一种从历史堆栈中删除某个活动的方法 并找到了解决方案这里 瓦卡斯的回答 https stackoverflow com questions 1898886 removing an activity from the history
  • 续集上的belongsToMany会自动创建新的连接表吗?

    我对这个续集很陌生 我尝试使用belongsToMany通过UserPermissions在用户和权限之间关联模型 这是我的代码 用户 js const bcrypt require bcrypt const config require