javascript - Sequelize 模型与模型无关

标签 javascript node.js sequelize.js

我一直在浪费时间。我有很多来源,它们都差不多,但我就是无法让我的项目发挥作用。

Sequelize.js - "is not associated to" 这个问题与我的非常相似,但是,我的这个问题不应该重复。因为它肯定有一个新问题!

列出我的资料来源,我已经仔细阅读并尝试过的资料:

  • Sequelize.js - "is not associated to"
  • Sequelize 4.3.2 n:m (many-to-many) association: Unhandled rejection SequelizeEagerLoadingError
  • Link to a book on Google
  • https://medium.com/@eth3rnit3/sequelize-relationships-ultimate-guide-f26801a75554

  • 为了添加上下文,我试图提供一个让用户获取他们的个人资料的路线。每个用户只有一个 Angular 色。

    像这样:
    {
      id: 4,
      email: 'adsads@saas.com',
      role: {
         id: 2,
         name: 'admin'
      }
    }
    

    将 findOne 与 WHERE 和 INCLUDE 一起使用
    exports.getme = (req, res) => {
      db.users.findOne({
        where: { id: req.user.id },
        include: [{
          model: db.roles,
        }]
      })  
      .then(data => {
        res.send(data)
      })
      .catch(err => {
        console.log(err)
        res.status(500).send({
          message: "An error has occured while retrieving data."
        })
      })
    }
    

    我得到的错误是:

    Role is not associated to User!



    这是模型,以及我如何放置它们各自的关联:

    Angular 色.js
    'use strict';
    module.exports = (sequelize, DataTypes) => {
      const Role = sequelize.define('Role', {
        id: {
          type: DataTypes.INTEGER,
          allowNull: false,
          primaryKey: true,
          autoIncrement: true,
          field: "id"
        },
        role: DataTypes.STRING
      }, {
        timestamps: false
      });
      Role.associate = function (models) {
        Role.hasMany(models.User, {
          foreignKey: "roleId",
          sourceKey: "id"
        })
      }
      return Role;
    };
    

    User.js
    'use strict';
    module.exports = (sequelize, DataTypes) => {
      const User = sequelize.define('User', {
        id: { type: DataTypes.BIGINT, allowNull: false, autoIncrement: true, unique: true, primaryKey: true },
        email: DataTypes.STRING,
      }, {});
      User.associate = function (models) {
        User.belongsTo(models.Role, { 
          foreignKey: "roleId", 
          targetKey: "id"
        });
      }
      return User
    }
    

    此外,当我检查我的表的 关系 时,我只能在我的 USER 表中看到详细信息,而在我的 ROLES 表中没有看到详细信息。

    enter image description here
    enter image description here

    编辑:评论部分的 Anatoly 指出,当 db.users 启动时,findOne 似乎没有关联。以下是我在 server.js 中设置模型的方法:
    ....
    const db = require("./app/models")
    
    if (process.env.NODE_ENV === "production") {
      db.sequelize.sync().then(() => {
        useRoutes()
        seedDB()
      })
    } else {
      db.sequelize.sync({ force: true }).then(() => {
        console.log("Drop and re-sync db.")
        useRoutes()
        seedDB()
      })
    }
    
    function useRoutes() {
      console.log("Use routes...")
      require("./app/routes/user/user.routes")(app)
      require("./app/routes/emojis/emojis.routes")(app)
      require("./app/routes/auth/auth.routes")(app)
    
      const db = require("./app/models")
      // Custom.
      db.op = db.Sequelize.Op
      // Models
      db.appsettings = require("./app/models/appsettings/appsettings.model")(db.sequelize, db.Sequelize)
      db.countries = require("./app/models/appsettings/country.model")(db.sequelize, db.Sequelize)
    
      db.users = require("./app/models/user/user.model")(db.sequelize, db.Sequelize)
      db.roles = require("./app/models/user/role.model")(db.sequelize, db.Sequelize)
      db.userscores = require("./app/models/user/userscore.model")(db.sequelize, db.Sequelize)
    
      db.answers = require("./app/models/game/answer.model")(db.sequelize, db.Sequelize)
      db.categories = require("./app/models/game/category.model")(db.sequelize, db.Sequelize)
      db.questions = require("./app/models/game/question.model")(db.sequelize, db.Sequelize)
      db.useracoomplishedquestions = require("./app/models/game/useracoomplishedquestion.model")(db.sequelize, db.Sequelize)
    }
    

    模型/index.js (由 Sequelize 生成,我对其进行了一些修改,并使用 glob 轻松扫描子文件夹)
    'use strict';
    
    const fs = require('fs');
    const path = require('path');
    const Sequelize = require('sequelize');
    const basename = path.basename(__filename);
    const env = process.env.NODE_ENV || 'development';
    const config = require(__dirname + '/../config/config')[env];
    const db = {};
    const glob = require("glob")
    
    let sequelize;
    if (config.use_env_variable) {
      sequelize = new Sequelize(process.env[config.use_env_variable], config);
    } else {
      sequelize = new Sequelize(config.database, config.username, config.password, config);
    }
    
    // Use glob to access model files inside subfolders.
    const files = glob.sync(__dirname + "/*/*.js")
    
    files.forEach(file => {
      const model = sequelize['import'](file);
      db[model.name] = model;
    })
    
    Object.keys(db).forEach(modelName => {
      if (db[modelName].associate) {
        db[modelName].associate(db);
      }
    });
    
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;
    
    module.exports = db;
    

    最佳答案

    通过这段代码

    // Models
      db.appsettings = require("./app/models/appsettings/appsettings.model")(db.sequelize, db.Sequelize)
      db.countries = require("./app/models/appsettings/country.model")(db.sequelize, db.Sequelize)
    
      db.users = require("./app/models/user/user.model")(db.sequelize, db.Sequelize)
      db.roles = require("./app/models/user/role.model")(db.sequelize, db.Sequelize)
      db.userscores = require("./app/models/user/userscore.model")(db.sequelize, db.Sequelize)
    
      db.answers = require("./app/models/game/answer.model")(db.sequelize, db.Sequelize)
      db.categories = require("./app/models/game/category.model")(db.sequelize, db.Sequelize)
      db.questions = require("./app/models/game/question.model")(db.sequelize, db.Sequelize)
      db.useracoomplishedquestions = require("./app/models/game/useracoomplishedquestion.model")(db.sequelize, db.Sequelize)
    

    您覆盖了在 models/index.js 中注册的模型定义,这就是这些模型没有关联的原因。只需删除这些行。

    关于javascript - Sequelize 模型与模型无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61718082/

    相关文章:

    javascript - 从另一个 javascript 文件调用函数

    javascript - 如何修复 react 功能不起作用(机器人重新启动后)

    javascript - mysql查询时异步 waterfall 不遵循顺序

    postgresql - 未处理的拒绝 SequelizeForeignKeyConstraintError : insert or update on table

    sequelize.js - Sequelize 3 表 : lost with relations

    javascript - 如何管理redux状态对象?

    javascript - 如何将隐藏输入传递给 JavaScript

    node.js - express.static(__dirname +'/public' ) 不起作用

    javascript - 使用 Node Webkit 读取 MP4 文件

    带有 Sequelize 的 ExpressJs