Получение сообщения "TypeError: Невозможно прочитать свойство '0' неопределенного" при попытке использовать перехватчики Sequelize - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь использовать ловушку Sequelize для автоматического создания профиля при создании пользователя, но, похоже, он не работает. Кто-нибудь может указать, что я делаю не так? Примечание. Я использую пакеты Sequelize 5.21.6 и mysql2 2.10.0.

Вот мои модели:

Пользователь. js

'use strict';
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;
};

Профиль. 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');
    },
};

А вот мой роутер:

const express = require('express');
const router = express.Router();
const models = require('../models');

// Create a new user
router.post('/', (req, res, next) => {
    models.User.create({
        name: req.body.name,
        username: req.body.username,
        email: req.body.email,
        password: req.body.password,
    })
        .then((user) => {
            res.json({ message: 'Profile created successfully' });
        })
        .catch((err) => {
            res.json({ message: err.errors[0].message });
        });
});
...