sequelize findAll 不检查当前用户是否喜欢帖子

我有一个场景,如果你喜欢一个帖子,它会改变

liked:false 到 liked:true

这个喜欢是基于当前用户是否喜欢该帖子。问题是当新用户注册时,liked尽管新用户不喜欢该帖子,它仍然会显示为真。

我如何能够检查当前用户是否喜欢该帖子?就检查当前用户是否喜欢该帖子而言,我认为我的逻辑有点不对。

我想保留findAll功能,我应该获得所有帖子,而不仅仅是当前用户。

有点像 instagram 或 facebook。

这是帖子数组

http://img2.mukewang.com/61b565840001059106390344.jpg

这就是我喜欢帖子的方式


喜欢帖子


likePost: async (req: any, res: Response) => {

    const created = await models.Likes.findOne({

      where: {

        userId: req.session.user.id,

        resourceId: req.params.id

      }

    });

    console.log(created);

    const post = await models.Post.findOne({ where: { id: req.params.id } });

    // if like not created then do this

    if (!created && post) {

      await models.Likes.create({

        userId: req.session.user.id,

        resourceId: req.params.id

      }).then(() => {

        post.increment("likeCounts", { by: 1 });

        post.update({ liked: req.session.user.id ? true : false });

        res.status(200).send({

          message: "You liked this post"

        });

      });

      // else if post does not exist

    } else if (!post) {

      res.status(200).send({

        message: "there is not post to be liked"

      });

    } else {

      // else if a like does exist destroy like

      await models.Likes.destroy({

        where: {

          userId: req.session.user.id

        }

      }).then(() => {

        post.decrement("likeCounts", { by: 1 });

        res.status(200).send({

          message: "You unliked this post"

        });

      });

    }

这就是我获取帖子的方式。


料青山看我应如是
浏览 226回答 2
2回答

潇湘沐

因此,通过遵循 @doublesharp 帮助,我能够通过使用续集数据类型VIRTUAL以及使用getDataValue来确定当前用户是否喜欢该帖子更新代码岗位(模型)"use strict";module.exports = (sequelize, DataTypes) => {    var Post = sequelize.define("Post", {        title: DataTypes.STRING,        postContent: DataTypes.STRING,        liked: {            type: DataTypes.VIRTUAL,            allowNull: false,            defaultValue: false,            get: function () {                return this.getDataValue('Likes').length ? true : false;            }        },        likeCounts: {            type: DataTypes.INTEGER,            allowNull: false,            defaultValue: 0,            validate: {                min: 0,            }        },        authorId: DataTypes.INTEGER    }, {});    Post.associate = function (models) {        Post.belongsTo(models.User, {            as: "author",            foreignKey: "authorId",            onDelete: "CASCADE"        });        Post.hasMany(models.Likes, {            foreignKey: "resourceId",            timestamps: false,            targetKey: "id",            onDelete: "CASCADE"        });    };    return Post;};//# sourceMappingURL=post.js.map

噜噜哒

我相信您看到的错误是因为您没有解决由以下人员返回的承诺:    post.increment("likeCounts", { by: 1 });    post.update({ liked: req.session.user.id ? true : false });这意味着将在这些查询执行之前发送响应。该post.liked值将user.id在会话中的任何时候设置为 true 。如果稍后的查询失败,您可能需要考虑使用事务来回滚一些较早的查询。我还建议使用Promise.all()进行并发查询(它会更快)并且只使用async/await不混入thenables.likePost: async (req: any, res: Response) => {  // fetch created and post at the same time  const [ created, post ] = await Promise.all([    models.Likes.findOne({      where: {        userId: req.session.user.id,        resourceId: req.params.id      }    }),    models.Post.findOne({      where: {           id: req.params.id      }    }),  ]);  // no post, no updates  if (!post) {    return res.status(200).send({      message: "there is no post to be liked"    });  }  // we are going to make updates, so use a transaction, you will need to reference sequelize  let transaction;  try {    transaction = await sequelize.transaction();    if (!created && post) {      // use Promise.all() for concurrency      await Promise.all([        models.Likes.create({          userId: req.session.user.id,          resourceId: req.params.id        }, { transaction }),        post.increment("likeCounts", { by: 1, transaction }),        post.update({ liked: req.session.user.id ? true : false }, { transaction }),      ]);      await transaction.commit();      return res.status(200).send({        message: "You liked this post"      });    }    await Promise.all([      models.Likes.destroy({        where: {          userId: req.session.user.id        }      }, { transaction }),      post.decrement("likeCounts", { by: 1, transaction }),    ]);    await transaction.commit();    return res.status(200).send({      message: "You unliked this post"    });  } catch (err) {    if (transaction) {      await transaction.rollback();    }    console.log('There was an error', err);    return res.status(500);  }}仅Likes在 getPost() 上返回当前用户getPosts: async (req: any, res: Response) => {  const posts = await models.Post.findAll({    include: [      { model: models.User, as: "author", attributes: ["username"] },      // limit the likes based on the logged in user      { model: models.Likes, required: false,        where: { userId: req.session.user.id },      },    ],    order: [["createdAt", "DESC"]],    limit: 6  });  return res.json(posts);},
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript