用户如何使用 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 来实现独特的?