首页 > 解决方案 > 使用 sequelize findAll 时,forEach 找不到正确的用户 ID

问题描述

我有一个场景,用户喜欢他的帖子,它会填满一颗心,很酷。如果用户 2 喜欢相同的帖子,用户 1 的心就会变得空虚。

有一个属性"likeByMe",它是一个布尔值。

它需要检查当前用户是否喜欢该帖子。

以下是场景

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

这就是我获取帖子的方式,我正在使用setDataValue

post.controller.js

getPosts: async (req: any, res: Response) => {
  // use async/await here
  const posts = await models.Post.findAll({
    include: [
      { model: models.User, as: "author", attributes: ["username"] },
      {
        model: models.Likes
      }
    ],
    order: [["createdAt", "DESC"]],
    limit: 6
  });

  posts.forEach(post => {
    if (post.Likes.length === 0) {
      post.setDataValue("likedByMe", false);
    }
    post.Likes.forEach(like => {
      console.log(like.userId);
      if (like.userId === req.session.user.id) {
        post.setDataValue("likedByMe", true);
      } else {
        post.setDataValue("likedByMe", false);
      }
    });
  });

  return res.json(posts);
},

标签: javascriptsequelize.js

解决方案


我现在无法对其进行测试,但是您确定该setDataValue方法在设置值后会保存模型实例吗?

根据文档,它的作用是:

更新基础数据值

从我的角度来看,这意味着它只是更新_data实例私有属性下的值,但不一定将这些更新保留在数据库中。

也许你应该save()在设置likedByMe值之后。


推荐阅读