node.js - 当使用 Sequelize.js 创建另一条记录时,如何在数据库中自动创建一条新记录?

标签 node.js express sequelize.js sequelize-cli sequelize-hooks

我正在使用 Sequelize version 5作为我的 ORM,定义了 User 和 Profile 模型。两个模型之间存在一对一的关系,我希望在创建用户时自动创建配置文件。我怎样才能做到这一点?我的模型定义如下:

用户.js

'use strict';
module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define(
        'User',
        {
            name: DataTypes.STRING,
            username: DataTypes.STRING,
            email: DataTypes.STRING,
            password: DataTypes.STRING,
        },
        {}
    );

    User.associate = function (models) {
        User.hasOne(models.Profile);
    };
    return User;
};


profile.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    const Profile = sequelize.define(
        'Profile',
        {
            location: DataTypes.STRING,
            websiteUrl: DataTypes.STRING,
            bio: DataTypes.TEXT,
            userId: DataTypes.INTEGER,
        },
        {}
    );
    Profile.associate = function (models) {
        Profile.belongsTo(models.User);
    };
    return Profile;
};

我也有以下迁移:

用户迁移
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      username: {
        type: Sequelize.STRING
      },
      email: {
        type: Sequelize.STRING
      },
      password: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

配置文件迁移
'use strict';
module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Profiles', {
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER,
            },
            location: {
                type: Sequelize.STRING,
            },
            websiteUrl: {
                type: Sequelize.STRING,
            },
            bio: {
                type: Sequelize.TEXT,
            },
            userId: {
                type: Sequelize.INTEGER,
                references: {
                    model: 'Users',
                    key: 'id',
                },
            },
            createdAt: {
                allowNull: false,
                type: Sequelize.DATE,
            },
            updatedAt: {
                allowNull: false,
                type: Sequelize.DATE,
            },
        });
    },
    down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('Profiles');
    },
};

最佳答案

您可以创建a hook您在其中定义配置文件的创建。
您也可以尝试使用Special Mixins可从关系中获得

Hook 方法:

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define(
    'User',
    {
        name: DataTypes.STRING,
        username: DataTypes.STRING,
        email: DataTypes.STRING,
        password: DataTypes.STRING,
    },
    {
       hooks: {
         afterCreate(user, options) => {
            Profile.create({userId: user.id)
       }
      }
    }
  );

  User.associate = function (models) {
    User.hasOne(models.Profile);
  };
  return User;
};

Mixin 方法
const user = await User.create({...userData});
const profile = await User.createProfile({userId: user.id, ...profileData});

关于node.js - 当使用 Sequelize.js 创建另一条记录时,如何在数据库中自动创建一条新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61311568/

相关文章:

node.js - 使用 Hapi.JS Joi 模块在 Express.JS 应用程序中验证和清理输入之间的区别?

node.js - Mongoose 发现总是在不应该返回 true 的时候返回 true

node.js - NodeJS - app.use(function(err, req, res, next){}) 和 process.on ('uncaughtException' , function(err){}) 之间的区别

node.js - 如何配置 WebStorm 调试器以与我的 Express 应用程序一起使用

node.js - 没有文件的Sequelize迁移

javascript - afterCreate 数据库 Hook 进程准备就绪后如何向客户端发送消息?

node.js - Koa-router 路由 url 不存在

javascript - 使用 Angular 上传后使用 Node 存储图像

node.js - 需要 Express 应用程序中的子模块

postgresql - 在 sequelize ENUM 类型上设置默认值