如何获取用户信息而不仅仅是 ID sequelize?

How to get user information instead of just ID sequelize?

我正在使用 mysql、

的续集

我有3个模型

  1. 帖子
  2. 评论
  3. 用户

帖子模型

module.exports = (sequelize, DataTypes) => {
  const Post = sequelize.define('Post', {
    title: DataTypes.STRING,
    content: DataTypes.TEXT,
    userId: DataTypes.INTEGER
  }, {});
  Post.associate = function(models) {
    // associations can be defined here
    Post.hasMany(models.Comment, {
      foreignKey: 'postId',
      as: 'comments',
      onDelete: 'CASCADE',
    })
    Post.belongsTo(models.User, {
      foreignKey: 'userId',
      as: 'author',
      onDelete: 'CASCADE',
    })
  };
  return Post;
};

评论模型

const user = require("./user");

module.exports = (sequelize, DataTypes) => {
  const Comment = sequelize.define(
    "Comment",
    {
      postId: DataTypes.INTEGER,
      comment: DataTypes.TEXT,
      userId: DataTypes.INTEGER,
    },
    {}
  );
  Comment.associate = function (models) {
    // associations can be defined here
    Comment.belongsTo(
      models.User,
      {
        foreignKey: "userId",
        as: "author",
        me: "name",
      },
      { name: user.name }
    );
    Comment.belongsTo(models.Post, {
      foreignKey: "postId",
      as: "post",
    });
  };
  return Comment;
};

用户模型

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define(
    "User",
    {
      name: DataTypes.STRING,
      email: DataTypes.STRING,
    },
    {}
  );
  User.associate = function (models) {
    // associations can be defined here
    User.hasMany(models.Post, {
      foreignKey: "userId",
      as: "posts",
      onDelete: "CASCADE",
    });

    User.hasMany(models.Comment, {
      foreignKey: "userId",
      as: "comments",
      onDelete: "CASCADE",
    });
  };
  return User;
};

以下是我在执行以下查询时得到的回复

const getAllPosts = async (req, res) => {
  try {
    const posts = await models.Post.findAll({
      include: [
        {
          model: models.Comment,
          as: "comments"
        },
        {
          model: models.User,
          as: "author"
        }
      ]
    });
    return res.status(200).json({ posts });
  } catch (error) {
    return res.status(500).send(error.message);
  }
};

回应

 "posts": [
    {
      "id": 1,
      "title": "1st post ever on this server",
      "content": "This is the content of the first post published on this type or architecture",
      "userId": 1,
      "createdAt": "2021-01-31T10:00:45.000Z",
      "updatedAt": "2021-01-31T10:00:45.000Z",
      "comments": [
        {
          "id": 1,
          "postId": 1,
          "comment": "this is the comment on first post",


          "userId": 1, // Also need a key val pair of username and his email ID just instead of UserID


          "createdAt": null,
          "updatedAt": null
        },
        {
          "id": 2,
          "postId": 1,
          "comment": "comment second",
          "userId": 1,
          "createdAt": "2021-01-31T15:34:27.000Z",
          "updatedAt": "2021-01-31T15:34:27.000Z"
        }
      ],
      "author": {
        "id": 1,
        "name": "test user",
        "email": "testuser@gmail.com",
        "createdAt": null,
        "updatedAt": null
      }
    }
  ]
}

我需要评论用户名的用户名和我在 table 中有字段的电子邮件 但我只是在获取用户 ID 我该怎么做, 我对续集非常陌生,我试过了,但我得到了相同的 hasMany 和 benlongsTo 结果。

根据我的观察,您需要 运行 嵌套 include 才能获得评论。

试试这个修改后的代码。

const getAllPosts = async (req, res) => {
  try {
    const posts = await models.Post.findAll({
      include: [
        {
          model: models.Comment,
          as: "comments",
          include: [
              {
              model: models.User,
              as: "author"
              }
           ]  
        },
        {
          model: models.User,
          as: "author"
        }
      ]
    });
    return res.status(200).json({ posts });
  } catch (error) {
    return res.status(500).send(error.message);
  }
};