Sequelize findOrCreate, включая партнеров - "Не удается прочитать свойство 'поле' из неопределенного" - PullRequest
0 голосов
/ 15 марта 2019

Здравствуйте. Я использую метод findOrCreate для вставки записей, но кажется, что этот метод не работает с включенными ассоциированными пользователями.Получение ошибки, если в БД существует ассоциативная ассоциация с использованием следующих входных данных.

Невозможно прочитать свойство 'field' из неопределенного

Первая попытка ( Успешно связь также создается в "сквозной" таблице)

[
  {
    "album_type": "compilation",
    "id": "21132268",
    "name": "Album One",
    "authors": [
      {
        "name": "Node Js",
        "suffix": "Dr."
      }
    ]
  }
]

Вторая попытка Ошибка (Имеется новый альбом, но с тем же автором (ами))

[
  {
    "album_type": "compilation",
    "id": "23398868",
    "name": "Album Two",
    "authors": [
      {
        "name": "Node Js",
        "suffix": "Dr."
      }
    ]
  }
]

Ошибка:

"Невозможно прочитать свойство 'поле' из неопределенного", ....... "TypeError: Невозможно прочитать свойство" поле "из неопределенного в параметрах.defaults.Object.keys.map.name ...........

Вот функция БД

var createAlbum = async (albums) => {
    try {
        // transaction handle
        return await models.sequelize.transaction (t => {

            // Prepare each album to be created
            return Promise.all(albums.map(album => {
                return models.Album.findOrCreate({
                    transaction: t,
                    where: {name: album.name}, // where: {id: album.id}
                    defaults: album,
                    include: ['authors']
                })
            }))
        });

    } catch (error) {
        // transaction will be rolled back if error
        logger.error(error);
        throw error;
    }
}

Модели

//album.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    var Album = sequelize.define('Album', {
        id: { type: DataTypes.INTEGER, primaryKey: true, allowNull: false },
        name: { type: DataTypes.STRING, primaryKey: true, allowNull: false },
        album_type: { type: DataTypes.STRING, allowNull: false },

    });

    Album.associate = (models) => {
        models.Album.belongsToMany(models.Author, {
            through: 'AlbumAuthor',
            as: 'authors',
            foreignKey: 'album_id',
            otherKey: 'author_name'
        })
    }

    return Album;
}

//author.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    var Author = sequelize.define('Author', {
        name: { type: DataTypes.STRING, primaryKey: true, allowNull: false },
        suffix: { type: DataTypes.STRING, allowNull: true }
    });

    return Author;
}

//album_author.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    var AlbumAuthor = sequelize.define('AlbumAuthor', {
        album_id: { type: DataTypes.INTEGER, primaryKey: true, allowNull: false },
        author_name: { type: DataTypes.STRING, primaryKey: true, allowNull: false }
    });

    AlbumAuthor.associate = (models) => {

        models.AlbumAuthor.belongsTo(models.Album, {
            onDelete: 'CASCADE',
            foreignKey: 'album_id',
            targetKey: 'id',
        }),

        models.AlbumAuthor.belongsTo(models.Author, {
            onDelete: 'CASCADE',
            foreignKey: 'author_name',
            targetKey: 'name'
        })
    }

    return AlbumAuthor;
}
...