sequelize / express-example

A proposal for the usage of Sequelize within an Express.JS application.
MIT License
2.5k stars 770 forks source link

cannot read 'prototype' of undefined #64

Closed TijmenH closed 7 years ago

TijmenH commented 7 years ago

EDIT: 7 minutes after posting this, ofcourse i find the solution by simply logging 'models' in the model. Yes, my table is called 'posters' and the model 'Poster'. But the models variable holds the table name. RESOLVED

EDIT2: So I received a notification that there was a reply and my answer isn't very clear. Just to make sure it's clear for you guys, I will clarify it a bit: So in my database I had my table named 'posterParts', so first letter lower case and plural. My model (schema/models) for Sequelize was named 'PosterPart' with the first letter capital and singular. in the code I was calling the 'PosterPart' (models.PosterPart) but I had to call the name defined in the database, so models.posterParts. This is more a mistake on my side and I would suggest naming your database tables the same as you name your models to not run in problems like mine.

----- Original question: I'm trying to get sequelize working with GraphQL in an express server, but I'm running into a problem. Sequalize on its own is working perfectly, but now I found this example to seperate models in seperate files. Of course I want that!

I tried to implement it exactly as it's done in this example, but it fails at this piece in models/index.js:

Object.keys(db).forEach((modelName) => {
  if ('associate' in db[modelName]) {
    db[modelName].associate(db);
  }
});

with the following error:

(...)/node_modules/sequelize/lib/associations/mixin.js:12
    if (!target.prototype || !(target.prototype instanceof this.sequelize.Model)) {
               ^

TypeError: Cannot read property 'prototype' of undefined

Since it uses the 'associate' from the model, I will include the setup of my model too:

export default (sequelize, DataTypes) => {
  const Poster = sequelize.define('posters', {
    title: DataTypes.STRING,
  });

  Poster.associate = (models) => {
    Poster.hasMany(models.PosterPart, {
      foreignKey: 'id',
    });
  };

  return Poster;
};

Now after a lot of debugging I initially thought using es6 syntax might be breaking it, so I tried to change all es6 syntax to be exactly as in this example, but it's still breaking. I get the following error:

I also thought that maybe the foreignKey: 'id' was causing issues, but that also don't seem to be the case.

Am I missing something obvious or is this a bug? I will revert to just using one big file for all models for now. But I would like to implement seperate models in the future, when the project is getting bigger.

ShellOliver commented 7 years ago

It resolves for me when I go back to default sytax of the models.

noway commented 7 years ago

Or typo.

gutouyu commented 7 years ago

helps a lot, thank you.