首页 > 解决方案 > Mongo:db.collection.findOne() 问题

问题描述

我正在尝试实现 Like 路线。当用户通过身份验证并想要喜欢另一个用户(尖叫)的帖子时,在 MongoDb 中应该使用以下参数在“喜欢”集合中创建一个文档:
1.screamId == 帖子的 ID
2.name == 用户谁喜欢这篇文章。
之后,该帖子的likeCount 增加1,然后将该帖子保存在数据库中。

我对 .find / .findOne 方法有疑问,因为我想检查帖子是否已被该用户喜欢。
我想实现一个条件,如果 likeDoc 已经存在,它应该返回“已经喜欢...”
// 使用 .find 方法,likeCount 正在增加(一切都很酷),但是检查 likeDoc 是否已经存在的条件不起作用,它每次都会创建具有相同screamId 和名称的新文档。
使用 .findOne 方法,我收到此错误:
(node:12240) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'name' of null at C:\Users\Marius\Desktop\my-app\back-end\routes\likes.js :20:11

您能否提供一些修复此错误的提示?

const router = express.Router();
const auth = require("../middleware/auth");

const { Scream } = require("../models/scream");
const { Like } = require("../models/like");

router.get("/:id", auth, async (req, res) => {
  const scream = await Scream.findById(req.params.id);
  if (!scream)
    return res
      .status(404)
      .send("The scream with the given ID was not found...");

  doc = await Like.findOne({
    screamId: req.params.id,
    name: req.user.name,
  });

  if (doc.name === req.user.name)
    return res.status(400).send("The scream is already liked");

  doc = new Like({
    screamId: req.params.id,
    name: req.user.name,
  });

  scream.likeCount++;
  await scream.save();

  await doc.save();
  res.send(doc);
});

module.exports = router;

标签: javascriptnode.jsmongodb

解决方案


req.user.name 不是有效的参数。检查您在 req 中传递名称参数的位置。理想情况下,它应该是 req.body.name 或 req.params.name。


推荐阅读