Sequelize 模型与模型无关

编程入门 行业动态 更新时间:2024-10-28 08:20:28
本文介绍了Sequelize 模型与模型无关的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我一直在无所事事地花费几个小时.我有很多资源,它们都差不多,但我就是无法让我的项目发挥作用.

这个问题

评论部分的 Anatoly 指出,当 findOne 启动时,db.users 似乎没有关联.以下是我在 server.js 中设置模型的方法:

....const db = require("./app/models")如果(process.env.NODE_ENV ===生产"){db.sequelize.sync().then(() => {使用路由()种子数据库()})} 别的 {db.sequelize.sync({ force: true }).then(() => {console.log("删除并重新同步数据库.")使用路由()种子数据库()})}函数 useRoutes() {console.log("使用路由...")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")//风俗.db.op = db.Sequelize.Op//楷模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.useracoomlishedquestions = require("./app/models/game/useracoomlishedquestion.model")(db.sequelize, db.Sequelize)}

models/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 ||'发展';const config = require(__dirname + '/../config/config')[env];const db = {};const glob = require("glob")让续集;如果(config.use_env_variable){sequelize = new Sequelize(process.env[config.use_env_variable], config);} 别的 {sequelize = new Sequelize(config.database, config.username, config.password, config);}//使用 glob 访问子文件夹中的模型文件.const 文件 = glob.sync(__dirname + "/*/*.js")files.forEach(file => {const model = sequelize['import'](file);db[model.name] = 模型;})Object.keys(db).forEach(modelName => {如果 (db[modelName].associate) {db[modelName].associate(db);}});db.sequelize = 续集;db.Sequelize = 续集;module.exports = db;

解决方案

通过这段代码

//模型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.useracoomlishedquestions = require("./app/models/game/useracoomlishedquestion.model")(db.sequelize, db.Sequelize)

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

I've been spending hours for nothing. I've had so many sources, they are all kinda the same, but I just couldn't make my project work.

This question Sequelize.js - "is not associated to" is so much the same to mine, BUT, this question of mine shouldn't be a duplicate. Because it has certainly a new issue!

To list down my sources, the ones that I've read thoroughly and tried out:

  • 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
  • medium/@eth3rnit3/sequelize-relationships-ultimate-guide-f26801a75554
  • To add context, I'm trying to provide a route that lets the users get their profile. Every USER has ONLY one ROLE.

    Like so:

    { id: 4, email: 'adsads@saas', role: { id: 2, name: 'admin' } }

    Using findOne with WHERE and 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." }) }) }

    The error that I get is:

    Role is not associated to User!

    And here are the models, and how I put their respective associations:

    Role.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 }

    Also, when I check the relations of my tables, I can only see details in my USER table, but none in my ROLES table.

    EDIT: Anatoly from the comment section pointed out that it seems db.users has no association when the findOne fires up. Here's how I setup my models in my 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) }

    models/index.js (generated by Sequelize and I modified it a bit and use glob to scan through subfolders easily)

    '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;

    解决方案

    By this code

    // 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)

    you overridden model definitions registered in models/index.js that's why these models don't have associations. Just remove these lines.

    更多推荐

    Sequelize 模型与模型无关

    本文发布于:2023-10-20 03:15:03,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1509677.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:模型   Sequelize

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!