Невозможно заполнить таблицу PostgreSQL с помощью однозначного сопоставления в Feathers-Sequelize - PullRequest
0 голосов
/ 01 марта 2019

У меня есть две таблицы: Пользователи и Счета .Один пользователь имеет одну учетную запись и наоборот.Вот мои две модели:

Модель пользователя

const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get('sequelizeClient');
  const user = sequelizeClient.define('users', {

   // omitting the definition for brevity
  });


  user.associate = function (models) {

    user.hasOne(models.accounts);

    // I could get things to work when I made it a one to many
    // but that's not what I want.
    // user.hasMany(models.accounts, { foreignKey: 'user_id' });
  };

  return user;
};

Модель учетной записи

const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get('sequelizeClient');
  const account = sequelizeClient.define('accounts', {

    // omitting the definition for brevity

  });

  account.associate = function (models) {

    account.belongsTo(models.users, {foreignKey: 'user_id'});

    // I can't get groups and roles working either but that's
    // another question...
    account.belongsToMany(models.groups, {
      through: 'accountsingroups',
      foreignKey: 'accountid'
    });
    account.belongsToMany(models.roles, {
      through: 'accountsinroles',
      foreignKey: 'accountid'
    });
  };

  return account;
};

Из этих моделей яполучить таблицу Users и таблицу Accounts , в которой есть дополнительный столбец с именем user_id.

У меня есть ряд хуков до создания: hashPassword, hashSecurityQuestions и relateAccount.Первые два работают без нареканий.Третий, где у меня проблемы.Вот мой relateAccount хук:

relteAccount перед созданием хука

module.exports = function (options = {}) {
  return function (context) {
    const AccountModel = context.app.services.accounts.Model;
    context.params.sequelize = {
      include: [{ model: AccountModel }]
    };
  };
};

С помощью вышеуказанной настройки я могу вставить нового пользователя в Пользователи используют Postman, но таблица Accounts остается пустой.Вот пример запроса почтальона:

{
    "username": "doctordonna",
    "firstname": "Donna",
    "lastname": "Noble",
    "email": "besttempinchiswick@tardis.com",
    "password": "ood1!",
    "accounts":
        {
            "questiononeid": "1a3ccccb-42ff-4553-9e54-824022414f50",
            "questiononeanswer": "100 words per minute",
            "questiontwoid": "6f9b0a38-0b1f-46dd-8726-2c9ff3566686",
            "questiontwoanswer": "Adipose Industries",
            "questionthreeid": "95c7f66f-63ef-48b2-b2b4-d73d383077e8",
            "questionthreeanswer": "Vesuvius",
            "questionfourid": "ff94887b-6015-4b84-8259-4801b2b404a3",
            "questionfouranswer": "Time Vortex",
            "isapproved": true,
            "lastactivitydate": null,
            "lastlogindate": null,
            "lastpasswordchangeddate": null,
            "isonline": false,
            "islockedout": false,
            "lastlockedoutdate": null,
            "failedpasswordattemptcount": 0,
            "failedpasswordattemptwindowstart": null,
            "isdeactivated": false,
            "deactivated_at": null
        }

}

Как я уже говорил выше, он отлично работает, когда я изменяю свои ассоциации на Один на Много , однако я хочу, чтобы это было Один в один .Если я удаляю user.hasOne(models.accounts); из пользовательской модели , я получаю сообщение об ошибке, говорящее error: SequelizeEagerLoadingError: accounts is not associated to users!

Очевидно, что я делаю что-то не так и полагаю, что не понимаю прочитанноекак в документации Sequelize, так и в документации по Feathers.

1 Ответ

0 голосов
/ 01 марта 2019

Тьфу.Это была действительно глупая ошибка с моей стороны.

В моем запросе мне нужно было сделать accounts singular- account.Поэтому мой запрос должен выглядеть так:

{
    "username": "doctordonna",
    "firstname": "Donna",
    "lastname": "Noble",
    "email": "besttempinchiswick@tardis.com",
    "password": "ood1!",
    "account":
        {
            "questiononeid": "1a3ccccb-42ff-4553-9e54-824022414f50",
            "questiononeanswer": "100 words per minute",
            "questiontwoid": "6f9b0a38-0b1f-46dd-8726-2c9ff3566686",
            "questiontwoanswer": "Adipose Industries",
            "questionthreeid": "95c7f66f-63ef-48b2-b2b4-d73d383077e8",
            "questionthreeanswer": "Vesuvius",
            "questionfourid": "ff94887b-6015-4b84-8259-4801b2b404a3",
            "questionfouranswer": "Time Vortex",
            "isapproved": true,
            "lastactivitydate": null,
            "lastlogindate": null,
            "lastpasswordchangeddate": null,
            "isonline": false,
            "islockedout": false,
            "lastlockedoutdate": null,
            "failedpasswordattemptcount": 0,
            "failedpasswordattemptwindowstart": null,
            "isdeactivated": false,
            "deactivated_at": null
        }

}
...