Búsqueda de sitios web

mysql - Error de Sequelize: Include inesperado. El elemento debe ser un Modelo, una Asociación o un objeto


Estoy recibiendo el error cuando hago una llamada a mi API con una solicitud GET:

Include unexpected. Element has to be either a Model, an Association or an object.

Mis modelos se ven así:

module.exports = (sequelize, Sequelize) => {
    const Productions = sequelize.define("productions", {
        id: {
            type: Sequelize.SMALLINT,
            autoIncrement: true,
            primaryKey: true
        },
        setupTime: {
            type: Sequelize.DECIMAL(6, 3)
        },
        notes: {
            type: Sequelize.TEXT
        }
    }, { timestamps: false });

    return Productions;
};
module.exports = (sequelize, Sequelize) => {
    const ProductionPrints = sequelize.define("productionPrints", {
        id: {
            type: Sequelize.SMALLINT,
            autoIncrement: true,
            primaryKey: true
        },
        compDate: {
            type: Sequelize.DATE
        }
    }, { timestamps: false });

    return ProductionPrints;
};

La relación entre los modelos se define aquí:

db.productions = require("./productions.model.js")(sequelize, Sequelize);
db.productionprints = require("./production-prints.model.js")(sequelize, Sequelize);

db.productions.hasOne(db.productionprints, {
    foreignKey: {
        name: 'productionId',
        allowNull: false
    }
});
db.productionprints.belongsTo(db.productions, { foreignKey: 'productionId' });

Y la consulta de Sequelize se ve así:

const db = require("../models");
const Productions = db.productions;
const ProductionPrints = db.productionPrints;

exports.findAll = (req, res) => {
    Productions.findAll({
        include: [ { model: ProductionPrints, as: 'prints' } ]
    })
        .then(data => {
            res.send(data);
        })
        .catch(err => {
            res.status(500).send({
                message:
                    err.message || "An error occurred while finding the productions."
            });
        });
};

He buscado a otros con el mismo problema pero no he tenido éxito con ninguna de las soluciones publicadas sobre esos problemas. Generalmente era causado por errores tipográficos o errores en las rutas de require. He revisado eso y todos mis otros includes funcionan, solo que no en ninguno de los modelos que incluyo en el modelo de producción.

Cualquier comentario es muy apreciado.

Respuesta #1

El error estaba siendo causado por un error tipográfico:

db.productions = require("./productions.model.js")(sequelize, Sequelize);
db.productionprints = require("./production-prints.model.js")(sequelize, Sequelize);

cuando esto estaba siendo referido en lo asignado a una constante:

const Productions = db.productions;
const ProductionPrints = db.productionPrints;

vergüenza para mí por cambiar el uso de mayúsculas:

db.productionprints != db.productionPrints

Respuesta #2

Tuve el mismo problema, esto generalmente es causado por un problema de nombres. Para rastrear el problema, puedes revisar uno de los siguientes lugares para resolverlo

  1. verifica si estás llamando al nombre de la clase del modelo correcto
  2. Al importar modelos, tenga cuidado de no llamar al nombre del archivo en lugar del nombre del modelo => el que se exportó

3. verifica si obtuviste tu asociación correctamente llamando al modelo exportado, no al nombre del archivo

  1. verifica si tus casos, por ejemplo usuarios vs Usuarios.

Un consejo adicional es usar el mismo nombre para el modelo y el nombre del archivo para evitar estos problemas, porque en el momento en que los haces diferentes es probable que cometas estos errores

Artículos relacionados