用户如何使用 sequelize postgres nodejs 互相喜欢和不同?

Posted

技术标签:

【中文标题】用户如何使用 sequelize postgres nodejs 互相喜欢和不同?【英文标题】:How can users like and unlike each others post using sequelize postgres nodejs? 【发布时间】:2021-02-27 17:34:21 【问题描述】:

我正在尝试实现用户可以互相点赞。

这是我的 Likes 模型:

const Likes = db.define("Likes", 

id: 
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
  ,
  PostId: 
  type: Sequelize.INTEGER,
   references: 
  model: "Post",
  key: "id",
   ,
onUpdate: "cascade",
onDelete: "cascade",
 ,
 userId: 
type: Sequelize.INTEGER,
references: 
  model: "User",
  key: "id",
,
onUpdate: "cascade",
onDelete: "cascade",
 ,
 createdAt: 
allowNull: false,
type: Sequelize.DATE,
 ,
updatedAt: 
allowNull: false,
type: Sequelize.DATE,
  ,

这是我的帖子模型:

id: 
  type: Sequelize.INTEGER,
  primaryKey: true,
  autoIncrement: true,
,
title: 
  type: Sequelize.STRING,
,
userId: 
  type: Sequelize.INTEGER,
,

这是我的用户模型:

id: 
  type: Sequelize.INTEGER,
  primaryKey: true,
  autoIncrement: true,
,
name: 
  type: Sequelize.STRING,
,

这是我的联想:

db.Likes.belongsTo(db.User,  foreignKey: "userId", targetKey: "id" );
db.Likes.belongsTo(db.Post,  foreignKey: "PostId", targetKey: "id" );
db.Post.hasMany(db.Likes,  foreignKey: "PostId", targetKey: "id" );
db.User.hasMany(db.Likes,  foreignKey: "userId", targetKey: "id" );

这是我的帖子和删除请求:

router.post("/:id/likes", async (req, res, next) => 
const  userId  = req;

const PostId = req.params.id;
const post = await Post.findByPk(PostId);

  if (!post)
return res
  .status(404)
  .send( message: "Post cannot be found or has been removed" );

let like = await Likes.findOne(
  where:  [Op.and]: [ PostId: req.params.id ,  userId: 
 req.userId  ] ,
 );

  if (!like) 
  let newLike = await Likes.create(
  userId: userId,
  PostId: req.params.id,
   );
   return res.json(newLike);
    else 
  await like.destroy();
  return res.send();
   
  );

我不断收到 UnhandledPromiseRejectionWarning:错误:WHERE 参数“userId”的“未定义”值无效。

在我的前端,当我执行 console.log(user.id) 时,我得到了喜欢帖子的用户的 id,当我执行 console.log(post.id) 时,我得到被喜欢的帖子的 id。

更新

这里是我将数据发送到后端的方式:

const likePost = (like) => 
 const data = new FormData();
 data.append("userId",like.userId);
 data.append("PostId",like.PostId)

console.log(like.PostId) // the post id is shown in terminal
console.log(like.userId) // the user id is shown in terminal

console.log(like)

return client.post(`/posts/$like.PostId/likes`, data);

console.log(like) 返回这个

Object 
 "PostId": 489,
 "userId": 43,
 

这是帖子的正确 id 和喜欢该帖子的用户。

这里是我的发帖请求:

router.post("/:id/likes", async (req, res, next) => 

 console.log(req.body); // returns an empty object 

 const PostId = req.params.id;
 const post = await Post.findByPk(PostId);

  if (!post)
  return res
  .status(404)
  .send( message: "Post cannot be found or has been removed" );

 let like = await Likes.findOne(
  where: 
  [Op.and]: [
     PostId: req.params.id ,
    //   userId: req.body.userId 
  ],
  ,
  );

  if (!like) 
let newLike = await Likes.create(
  // userId: req.body.userId,
  PostId: req.params.id,
);
return res.json(newLike);
   else 
await like.destroy();
return res.send();
 
);

这样做后我仍然无法在 req.body 中获取 userId

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

您的findOne 查询中似乎需要req.params.userId,假设userId 是在请求​​的参数中传递的:

 userId: req.params.userId 

【讨论】:

嗨@Harry,我在请求的参数中传递了postId 那么这应该可以解决您的问题。请将答案标记为正确。 当我做 req.params.userId 我得到未定义。因为我在请求的参数中传递了 postId【参考方案2】:
client.post(/posts/$like.PostId/likes,  userId: like.userId, PostId:like.PostId ) 

在前端使用它,我可以在后端访问 req.body,谢谢@Anatoly

【讨论】:

以上是关于用户如何使用 sequelize postgres nodejs 互相喜欢和不同?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:如何在 Sequelize 中使用 Postgres 存储过程?

如何在 Sequelize Postgres 中使用小写函数

Sequelize Postgres - 如何使用 ON CONFLICT 来实现独特的?

如何在 NestJs 框架中使用 postgres 和 sequelize 正确定义 DTO 对象

Sequelize w/Postgres 测试异步错误

如何在 mysql Sequelize 实例中拥有数组的数据类型?