亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

sequelize findAll 不檢查當前用戶是否喜歡帖子

sequelize findAll 不檢查當前用戶是否喜歡帖子

料青山看我應如是 2021-12-12 10:58:57
我有一個場景,如果你喜歡一個帖子,它會改變liked:false 到 liked:true這個喜歡是基于當前用戶是否喜歡該帖子。問題是當新用戶注冊時,liked盡管新用戶不喜歡該帖子,它仍然會顯示為真。我如何能夠檢查當前用戶是否喜歡該帖子?就檢查當前用戶是否喜歡該帖子而言,我認為我的邏輯有點不對。我想保留findAll功能,我應該獲得所有帖子,而不僅僅是當前用戶。有點像 instagram 或 facebook。這是帖子數組這就是我喜歡帖子的方式喜歡帖子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"        });      });    }這就是我獲取帖子的方式。
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

因此,通過遵循 @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


查看完整回答
反對 回復 2021-12-12
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

我相信您看到的錯誤是因為您沒有解決由以下人員返回的承諾:


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

},


查看完整回答
反對 回復 2021-12-12
  • 2 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號