Ошибка ограничения ForeignKey при попытке создать ассоциацию с sequelize - PullRequest
0 голосов
/ 05 февраля 2019

Итак, у меня есть простая настройка с использованием трех моделей: пользователи / сообщения / чаты.Я связался с моделью чата, чтобы чаты принадлежали многим сообщениям, а сообщения принадлежали чату.Когда я пытаюсь выполнить Models.Messages.create ({args.message}) в распознавателе, он выдает ошибку:

Выполнение (по умолчанию): СОЗДАТЬ РАСШИРЕНИЕ, ЕСЛИ НЕ СУЩЕСТВУЕТ "uuid-ossp";sequelize.js: 1091 Выполнение (по умолчанию): INSERT INTO "Messages"> ("messageId", "message", "creationAt", "updatedAt") ЗНАЧЕНИЯ> (uuid_generate_v4 (), 'Ricks is greats', '2019-02-04 21: 40: 01.438> +00: 00 ',' 2019-02-04 21: 40: 01.438 +00: 00 ') ВОЗВРАЩЕНИЕ *;sequelize.js: 1091 SequelizeForeignKeyConstraintError: вставка или обновление таблицы> «Сообщения» нарушает ограничение внешнего ключа «Messages_messageId_fkey»

Поэтому я пытаюсь создать простое приложение для чата, в котором я использую классы es6Эксперимент, чтобы увидеть, могу ли я получить продолжение работы

Это модель сообщений:

'use strict';
import Sequelize, { Model } from 'sequelize';
import Models from './';

module.exports = class Message extends Model {
    static tableName = 'Message';

    freezeTableName = true;
    sync = true;

    static init(sequelize) {
        return super.init({
            messageId:{
                allowNull: true,
                primaryKey: true,
                type: Sequelize.DataTypes.UUID,
                defaultValue: Sequelize.literal('uuid_generate_v4()'), 
            },
            message: Sequelize.STRING,
            chat_id: {
                type: Sequelize.STRING,
                allowNull: true
            }
        }, { sequelize })
      };

    static associate(models) {
        this.belongsTo(models.Chats, { as: 'Chat', constraints: false});
    }
}

Это модель чата:

'use strict';
import Sequelize, { Model } from 'sequelize';
import Models from './';

module.exports = class Chat extends Model {
  static tableName = 'Chat';

  freezeTableName = true;

  sync = true;

  static init(sequelize) {
    return super.init({
      chatId:{
        allowNull: true,
        primaryKey: true,
        type: Sequelize.DataTypes.UUID,
        defaultValue: Sequelize.literal('uuid_generate_v4()'), 
      },
      name: Sequelize.STRING
    }, { sequelize })
  };

  static associate(models) {
    this.belongsToMany(models.Users, { as: 'Users', constraints: false, 
    through: 'user_chat'});

    this.belongsToMany(models.Messages, { targetKey:'chat_id' , 
    constraints: false, through: 'chat_message'});
  }
}

Это чатыresolver из настройки graphql:

import { resolver } from 'graphql-sequelize';
import {Models, sequelize} from '../../models';

exports.resolver = {
    Mutation: {
        addChat: (parent, args) => {
            console.log(Models);
            const chat = Models.Chats.create({
                name: args.name,
                user: args.friendId
            }).catch((err)=>{
                Promise.reject(err);
            })

            return chat;
        },
        addMessage: async (parent, args) => {
            try {    
                // update messages
                return Models.Chats.findOne({where: {chatId: args.chatId}})
                    .then(function(chat) {
                        console.log(chat);
                        console.log(typeof chat);
                        return Models.Messages.create({message: args.message})
                            .then((message) => {
                                console.log(message);
                                return    chat.addMessage(message.messageId);
                            })

                    })

            } catch (error) {
                throw new Error('Error: ' + error);
            }      

        }   
    },
    Query: {
        getMessages: (parent, args) => {
            return Models.Messages.findAll({
                where: {chatId: args.chatId},
                include: [ {model: Models.Chats, as: 'Chat'}]
            })
            },
        getChat: resolver(async () => { return await Models.Chat})
    }
}

Ошибка происходит в addMessage resolver при выполнении Models.Messages.create ({message: args.message});

Я перепробовал все виды:транзакции для принудительной фиксации, определяющие внешний ключ на целевой модели.Я думаю, что у меня что-то не так, может кто-нибудь помочь?это раздражало меня уже несколько дней.Если вам нужна дополнительная информация, пожалуйста, спросите.Спасибо.

Ожидаемый результат заключается в том, что когда я делаю .create на модели, он не выдает ошибку, когда я пытаюсь создать экземпляр этой Модели.Фактический результат заключается в том, что он выдает ошибку ограничения внешнего ключа.

...