web-dev-qa-db-ja.com

hasManyがSequelize.Modelのインスタンスではないもので呼び出されました

皆さんが私の問題がタイトルの説明に関連しているのを見ることができるので、私はユーザーモデルとフォトモデルを続編で作成しました。

マイユーザーモデル

    "use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');
var Foto = require('./Foto');

module.exports = function (sequelize, DataTypes) {
  var User = sequelize.define("User", {
    username: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isUnique: function (value, next) {
          var self = this;
          User.find({ where: { username: value } })
            .then(function (user) {
              // reject if a different user wants to use the same username
              if (user && self.id !== user.id) {
                return next('username already in use!');
              }
              return next();
            })
            .catch(function (err) {
              return next(err);
            });
        }
      }
    },

    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isUnique: function (value, next) {
          var self = this;
          User.find({ where: { email: value } })
            .then(function (user) {
              // reject if a different user wants to use the same email
              if (user && self.id !== user.id) {
                return next('Email already in use!');
              }
              return next();
            })
            .catch(function (err) {
              return next(err);
            });
        }
      }
    },

    typeOfUser: {
      type: DataTypes.INTEGER,
      allowNull:true,
      defaultValue:null
    },

    country: {
      type: DataTypes.STRING,
      allowNull:true,
      defaultValue:null
    },

    birthDate:{
      type: DataTypes.DATEONLY,
      allowNull:true,
      defaultValue:null
    },

    reports: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    },

    points: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    },

    password: {
      type: DataTypes.STRING,
      allowNull:false
    },

    numberFotos: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    }
  }, {
      classMethods: {
        generateHash: function (password) {
          return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },

      },
      instanceMethods: {
        validPassword: function (password) {
          return bcrypt.compareSync(password, this.password);
        }
      }


    });

  User.hasMany(Foto,{as: 'fotos', foreignKey: 'userId'})

  return Foto;
}

私の写真モデル

"use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');
var User = require('./User');


module.exports = function (sequelize, DataTypes) {
  var Foto = sequelize.define("Foto", {
    reports: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    },
    image: {
      type: DataTypes.STRING,
      allowNull: false
    },
    date: {
      type: DataTypes.DATE,
      allowNull:true
    },
    position: {
      type: DataTypes.RANGE,
      allowNull: true
    }
  });

  Foto.belongsTo(User, {foreignKey: 'userId'});

  return Foto;
}
7
user8014710

フォトモデルで関連付けを宣言する必要はありません。

Foto.belongsTo(User, {foreignKey: 'userId'});

モデル間に1:Nの関係がある場合、参照する必要があるのは、「1」モデル(この場合はユーザーモデル)、「N」モデル、写真からのIDだけです。そうすること:

User.hasMany(Foto,{as: 'fotos', foreignKey: 'userId'})

ユーザーテーブルを参照する "userId"という名前の列をFotoテーブルに作成します。このようにして、両方のモデルが必要に応じて関連付けられます。

21
Ellebkey

1つのファイルで両方のモデルの関係を定義できます。その方法ではエラーはスローされません。

Foto.jsで、あなたは試すことができます:

...

Foto.belongsTo(User);
User.hasMany(Foto);

return Foto;
4
Toufiq

同様の問題がありました。 index.jsまたはapp.jsでファイルが特定の順序で読み込まれるために発生することがあります。たとえば、AとBの間に関係があり、Aが最初に読み込まれてBを参照し、Bが順番にAを参照する場合、Aはまだ完全に定義/実行されていないため、Bファイル内でエラーがスローされます。

これに対する解決策は、モデルファイルからすべての関連付けを削除し、アプリまたはindex.js内でそれらすべてを要求してから、それらの関係を定義することです。

const entities = {
  A: require('./src/Entity/A'),
  B: require('./src/Entity/B'),
};
entities.A.belongsToMany(entities.B, {through: 'AB'});
entities.B.belongsToMany(entities.A, {through: 'AB'});

1:多くの関連の1つの部分を含むファイルで関係の両端を定義する必要があるようです。つまり、あなたの場合の「ユーザー」ファイルです。

そう:

User.hasMany(Foto); Foto.belongsTo(User);

1
Scar Coder