Невозможно вставить идентификатор в таблицу, принадлежащую к таблице с внешним ключом, с помощью Sequelize - PullRequest
0 голосов
/ 12 октября 2018

Я создаю безсерверное приложение с использованием узла js и использую claudia-api-builder в качестве платформы для запуска API в AWS.

В файле app.js я вызываю требуемый API как

const ApiBuilder = require('claudia-api-builder');
const api = new ApiBuilder();
module.exports = api;

api.post('/api/auth/validatephonenumber', async function (request) 
{
    return new Promise((resolve, reject) => {
        index.loadDatabase().then((db) => {
            resolve(loginController.validatePhonenumber(db, request));
        });
    });
});

Ниже приведен мой код:

async function validatePhonenumber(db, request) {
return new Promise(
    async (resolve, reject) => {
        let emailid;            
        await db.EmailRegistration.sync().then(function () {
             emailid = db.EmailRegistration.findOne({
                where: { email: { [Op.eq]: mailid } },
                attributes: ['id'],
            });
        });
        if (emailid != null) {
            console.log(`email id: ${emailid.id}`);
            await db.ContactDetails.sync().then(function () {
                db.ContactDetails.findOrCreate({
                    where: { contactnumber: phnum },
                    defaults: { EmailRegistrationId: emailid.id },
                }).spread((contactdetails, created) => {
                    console.log(`contactdetails: ${contactdetails}`);
                    if (contactdetails !== null) {
                        resolve({ statuscode: indexController.statusCode.statusOK, contactdetails: contactdetails })
                    } else {
                        reject({ statuscode: indexController.statusCode.InternalServerError, message: 'phone number not created' });
                    }
                });
            });
        };
    });
}

Я пытаюсь добавить электронный адрес для регистрации EmailRegistrationтаблица в таблицу ContactDetails в качестве ссылки на внешний ключ.Я использую sequelize с mysql, nodejs для достижения желаемых результатов.Но я получаю сообщение об ошибке ниже:

Необработанное отклонение SequelizeForeignKeyConstraintError: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (inmeeydb. ContactDetails, CONSTRAINT ContactDetails_ibfk_1 FOREIGN KEY (EmailRegistrationId) ССЫЛКИ EmailRegistration (id) НА УДАЛЕННОМ КАСКАДЕ НА ОБНОВЛЕНИИ КАСКАДА)

Ниже приведен мой файл моделей EmailRegistration:

const moment = require('moment');

module.exports = (sequelize, DataTypes) => {
const EmailRegistration = sequelize.define(
'EmailRegistration',
{
  id: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false,
    defaultValue: DataTypes.UUIDV4,
  },
  email: {
    type: DataTypes.STRING(50),
    allowNull: false,
  },
  password: {
    type: DataTypes.STRING,
    allowNull: false,
    validate: { min: 6 },
  },
  createdAt: {
    type: DataTypes.DATE,
    get() {
      return moment.utc(new Date(), 'DD/MM/YYYY h:mm a').format('DD/MM/YYYY h:mm a');
    },
  },
  updatedAt: {
    type: DataTypes.DATE,
    defaultValue: null,       
  },
},
{
  freezeTableName: true,
}
);

EmailRegistration.associate = function (models) {
    EmailRegistration.hasOne(models.ContactDetails,
        { foreignKey: 'EmailRegistrationId' }
    );
};

return EmailRegistration;
};

Ниже приведены мои модели Contactdetailsfile:

const moment = require('moment');

module.exports = (sequelize, DataTypes) => {
const ContactDetails = sequelize.define(
'ContactDetails',
{
  id: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false,
    defaultValue: DataTypes.UUIDV4,
  },
  contactnumber: { type: DataTypes.STRING(13), allowNull: false },
  isverified: { type: DataTypes.BOOLEAN, defaultValue: false },
  createdAt: {
    type: DataTypes.DATE,
    get() {
      return moment.utc(new Date(), 'DD/MM/YYYY h:mm a').format('DD/MM/YYYY h:mm a');
    },
  },
  updatedAt: {
    type: DataTypes.DATE,
    defaultValue: null,        
  },
},
{
  indexes: [{ fields: ['contactnumber'], unique: true }],
},
{
  freezeTableName: true,
}
);

ContactDetails.associate = function(models) {
ContactDetails.belongsTo(models.EmailRegistration, {
  onDelete: 'CASCADE',
  hooks: true,
  foreignKey: { allowNull: false },
});
};   


return ContactDetails;
};

Я пытался изменить код, как показано ниже, со ссылкой в ​​обеих таблицах, но ничего не получалось.

ContactDetails.associate = function(models) {
    ContactDetails.belongsTo(models.EmailRegistration,
    { foreignKey: 'EmailRegistrationId' }
    );
};

Не удалось проанализировать, как решить проблему.Это работало нормально, когда я использовал nodejs с expressjs и не было проблем.Он не может определить EmailRegistrationId (который отсутствует в запросе) в таблице ContactDetails и отображает вывод как

INSERT INTO `ContactDetails` (`id`,`contactnumber`,`isverified`,`createdAt`,`updatedAt`) VALUES ('52974e07-8489-4101-ab71-6af874903290','+xxxxxxxxx',false,'2018-10-12 08:55:35','2018-10-12 08:55:35');

1 Ответ

0 голосов
/ 12 октября 2018

Вам необходимо обновить конфигурацию вашей ассоциации.Модель ContactDetails теперь будет иметь поле с именем emailregistrationid

EmailRegistration.associate = function (models) {
  EmailRegistration.hasMany(models.ContactDetails);
};

ContactDetails.associate = function(models) {
  ContactDetails.belongsTo(models.EmailRegistration, {
    onDelete: 'CASCADE',
    hooks: true,
    foreignKey: {
      name: 'emailregistrationid'
      allowNull: false
    },
  });
}

ContactDetails.create({
  ...
  emailregistrationid: <some_valid_emailregistrationid>
})
...