UnhandledPromiseRejectionWarning: SequelizeUnknownConstraintError: неизвестная ошибка ограничения

#javascript #node.js #postgresql #sequelize.js

#javascript #node.js #postgresql #sequelize.js

Вопрос:

Я работаю с API в NodeJS и Express для подключения к базе данных PostgreSQL с помощью Sequelize. Когда я запускаю свою программу в конце вывода Sequelize в терминале, я получаю:

 Executing (default): ALTER TABLE "installation_sites" DROP CONSTRAINT "installation_sites_contractor_id_fkey"
(node:21312) UnhandledPromiseRejectionWarning: SequelizeUnknownConstraintError: Unknown constraint error
    at Query.formatError (C:UserscalebOneDriveDocumentosAplicativo_RDOAPInode_modulessequelizelibdialects
postgresquery.js:376:17)
    at Query.run (C:UserscalebOneDriveDocumentosAplicativo_RDOAPInode_modulessequelizelibdialects
postgresquery.js:87:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
Executing (default): ALTER TABLE "installation_sites" ALTER COLUMN "contractor_id" SET NOT NULL;
ALTER TABLE "installation_sites"  ADD FOREIGN KEY ("contractor_id") REFERENCES "contractors" ("contractor_id") 
ON DELETE NO ACTION ON UPDATE CASCADE;
(node:21312) UnhandledPromiseRejectionWarning: SequelizeUnknownConstraintError: Unknown constraint error
    at Query.formatError (C:UserscalebOneDriveDocumentosAplicativo_RDOAPInode_modulessequelizelib
dialectspostgresquery.js:376:17)
    at Query.run (C:UserscalebOneDriveDocumentosAplicativo_RDOAPInode_modulessequelizelib
dialectspostgresquery.js:87:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:21312) UnhandledPromiseRejectionWarning: Unhandled promise rejection. 
This error originated either by throwing inside of an async function without a catch block, 
or by rejecting a promise which was not handled with .catch(). To terminate the node process 
on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` 
(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:21312) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. 
In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
 

Я не понимаю, что является причиной этого. Вот мои модели, задействованные:

InstallationSite.js модель:

 const Sequelize = require("sequelize");
const sequelize = require("../database/index");
const Contractor = require("../models/Contractor");
const JobPosition = require("./JobPosition");

class InstallationSite extends Sequelize.Model {}

InstallationSite.init(
  {
    installation_site_id: {
      type: Sequelize.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
    },
    installation_site_status: {
      type:Sequelize.STRING,
      allowNull:false,
      validate:{
        isIn:[['Em Andamento', "Finalizada", "Não Iniciada"]]
      }
    },
    enterprise_name: {
      type: Sequelize.STRING,
      allowNull: false,
    },
    enterprise_start_date: {
      type: Sequelize.DATEONLY,
      allowNull: false,
    },
    enterprise_duration_days: {
      type: Sequelize.INTEGER,
      allowNull: false,
    },
    enterprise_city: {
      type: Sequelize.STRING,
      allowNull: false,
    },
    enterprise_state: {
      type: Sequelize.STRING,
      allowNull: false,
    },
    contractor_id: {
      type: Sequelize.INTEGER,
      allowNull: false,
      references: {
        model: "contractors",
        key: "contractor_id",
      },
    },
  },
  {
    sequelize,
    timestamps: false,
    tableName: "installation_sites",
  }
);

InstallationSite.belongsTo(Contractor, {
  foreignKey: "contractor_id",
  targetKey: "contractor_id",
});
Contractor.hasMany(InstallationSite, {
  foreignKey: "contractor_id",
  sourceKey: "contractor_id",
});

InstallationSite.belongsToMany(JobPosition, {
  through: "contracts",
  foreignKey: "installation_sites_intallation_site_id",
  as: "positions",
});

JobPosition.belongsToMany(InstallationSite, {
  through: "contracts",
  foreignKey: "job_positions_job_position_id",
  as: "installations",
});

sequelize.sync({ alter: true });
module.exports = InstallationSite;
 

Contractor.js модель:

 const Sequelize = require("sequelize");
const sequelize = require("../database/index");

class Contractor extends Sequelize.Model {}

Contractor.init(
  {
    contractor_id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true,
      allowNull: false,
    },
    contractor_name: {
      type: Sequelize.STRING,
      validate: {
        is: {
          args: /[a-zA-z]/,
          msg: "Contractor name must contain only letters",
        },
        len: {
          args: [5, 50],
          msg:
            "Contractor name must contain at least five letters and less than 50 letters",
        },
        notEmpty: {
          args: true,
          msg: "Contractor name is not optional",
        },
      },
    },
  },
  {
    sequelize,
    timestamps: false,
    tableName: "contractors",
  }
);

sequelize.sync({ alter: true });
module.exports = Contractor;
 

Я хотел бы знать, может ли кто-нибудь помочь мне выяснить, что вызывает это предупреждение.

[РЕДАКТИРОВАТЬ] Ограничение installation_sites_contractor_id_fkey , похоже, существует внутри БД.

Изображение содержимого БД

[ПРАВКА2]

После того, как вручную была выполнена команда ALTER TABLE "installation_sites" DROP CONSTRAINT "installation_sites_contractor_id_fkey" , первоначально она не смогла найти ограничение, но я снова запустил, и ответ был found null row , и ограничение исчезло. Я снова запустил свой сервер, и было создано несколько повторяющихся ключей installation_sites_contractor_id_fkey, а затем sequelize начал жаловаться на другие fkeys. Я все еще не могу понять это поведение

Комментарии:

1. Вы проверяли, есть ли у вас installation_sites_contractor_id_fkey внешний ключ в БД?

2. Да, кажется, это

3. ОК. Вы пытались выполнить вручную ALTER TABLE "installation_sites" DROP CONSTRAINT "installation_sites_contractor_id_fkey" ?

4. Я лучше объяснил, что произошло в отредактированном теле моего вопроса @Anatoly

5. Возможно, вам следует попытаться указать оба ключа в belongsToMany : foreignKey и otherKey