express - Sequelize 关联不正确

标签 express sequelize.js

我想建立这样的关系:
erd

我希望每个用户都包含消息列表,并且每条消息都包含有关发件人的信息。与我发布的 ERD 相关。

我用于迁移的代码:

    module.exports = {
      up: (queryInterface, Sequelize) =>
        queryInterface.createTable('Messages', {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER,
          },
          text: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          toUserId: {
            type: Sequelize.INTEGER,
            // TODO changed from CASCADE - not sure about change
            onDelete: 'CASCADE',
            references: {
              model: 'Users',
              key: 'id',
              as: 'toUserId',
            },
          },
          fromUserId: {
            type: Sequelize.INTEGER,
            // TODO changed from CASCADE - not sure about change
            onDelete: 'CASCADE',
            references: {
              model: 'Users',
              key: 'id',
              as: 'fromUserId',
            },
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
        }),
      down: (queryInterface /* , Sequelize */) =>
        queryInterface.dropTable('Messages'),
    };

module.exports = {
  up: (queryInterface, Sequelize) =>
    queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      firstName: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      lastName: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      lat: {
        allowNull: true,
        type: Sequelize.INTEGER,
      },
      lng: {
        allowNull: true,
        type: Sequelize.INTEGER,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATEONLY,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATEONLY,
      },
    }),
  down: (queryInterface /* , Sequelize */) => queryInterface.dropTable('Users'),
};

对于模型:
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER,
    },
    firstName: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    lastName: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    lat: {
      allowNull: true,
      type: DataTypes.INTEGER,
    },
    lng: {
      allowNull: true,
      type: DataTypes.INTEGER,
    },
    createdAt: {
      allowNull: false,
      type: DataTypes.DATEONLY,
    },
    updatedAt: {
      allowNull: false,
      type: DataTypes.DATEONLY,
    },
  });

  User.associate = (models) => {
    User.hasMany(models.Message, {
      foreignKey: 'toUserId',
      as: 'messages',
    });
  };

  return User;
};
module.exports = (sequelize, DataTypes) => {
  const Message = sequelize.define('Message', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER,
    },
    text: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    createdAt: {
      allowNull: false,
      type: DataTypes.DATE,
    },
    updatedAt: {
      allowNull: false,
      type: DataTypes.DATE,
    },
  });

  Message.associate = (models) => {
    Message.belongsTo(models.User, {
      foreignKey: 'toUserId',
    });
  };
  return Message;
};

但是,当我尝试添加新消息 fromUserId 时显示为 Null 值。
当我尝试获取消息时,它看起来像:
[
    {
        "id": 1,
        "text": "mytext",
        "createdAt": "2018-11-29T20:12:22.253Z",
        "updatedAt": "2018-11-29T20:12:22.253Z",
        "toUserId": 2,
        "User": {
            "id": 2,
            "firstName": "name1",
            "lastName": "name2",
            "lat": null,
            "lng": null,
            "createdAt": "2018-11-29",
            "updatedAt": "2018-11-29"
        }
    }
]

最佳答案

根据您的 ERD 我认为您的 relationships 应该是这样的。

用户有很多消息

消息属于用户
在这种情况下,您的 Message 迁移应该是这样的。

id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER,
          },
          text: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          fromUserId: {
            type: Sequelize.INTEGER,
            // TODO changed from CASCADE - not sure about change
            onDelete: 'CASCADE',
            references: {
              model: 'Users',
              key: 'id',
            },
          },

请注意,我也删除了 toUserId 列和这个别名 as: 'fromUserId',

在您的 User 迁移中, 是正确的 您不需要更改其中的任何内容。

在您的 Message 模型中
  Message.belongsTo(models.User, {
      foreignKey: 'fromUserId',
    });
  };

请注意,您只有一个 FK,它是 fromUserId
在您的 User 模型中。
User.associate = (models) => {
    User.hasMany(models.Message, {
      foreignKey: 'fromUserId',
    });
  };

完成所有这些后,您将能够获得属于 user_id 的消息。

关于express - Sequelize 关联不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53546938/

相关文章:

node.js - Node (内存泄漏,v8 快照)- 使用连接 promise 是不好的做法吗?

postgresql - 从 sequelize 原始查询返回更新的值

javascript - Express,用json创建cookie

node.js - 如何使用 gulp 设置 ExpressJS 自动重新加载 (gulp-live-server)

sql - 使用 Node.js 连接表的 GraphQL 查询

graphql - 如何使用 sequelize-typescript 通过自定义 Apollo GraphQL 解析器查询相关对象?

mysql - 在同一列中进行多次搜索 MySQL Sequelize,

node.js - 如果这个nodejs Rest api 正常并且它的 mongoose 结构和 mongodb 数据正常的话,为什么我会从 mongoDB 得到空值?

mysql - 重置 MySQL 自动增量作为 Node.js 单元测试中的拆卸步骤

node.js - 将 Node 与 Nano 和 couchdb 一起使用时出现 ECONNREFUSED