【问题标题】:How to count total amount of comments per posts in nodejs, react js and sequelize?如何计算nodejs中每个帖子的评论总数,react js和sequelize?
【发布时间】:2021-07-14 19:04:48
【问题描述】:

我正在开展一个项目,用户可以在该项目中提出和回答问题,因此在提交的 cmets 中我遇到了麻烦。 cmets 表运行良好并显示数据并可以删除数据,但我想计算每个帖子的 cmets 总数。

这些代码运行良好,但它计算了表中的所有 cmets,这就是我不想要的,我想显示每个帖子的总数,而不是一个帖子中的所有 cmets 数量。

    router.get("/commentsCounter/:id", async (req, res) => {
  const id = req.params.id;
  const commentsCounter = await Comments.count(id);

  res.json({commentsCounter});
  console.log('commentsCounter', commentsCounter)
});

在评论表中,我有评论正文、作者姓名和 postId。

有什么建议吗?

【问题讨论】:

    标签: mysql node.js reactjs sequelize.js


    【解决方案1】:

    Sequelize count 方法将一个对象作为其参数,您可以在其 where 属性中指定您的帖子 ID。因此,在您的情况下,您希望将查询更改为

    const commentsCounter = await Comments.count({ where: { postId: id} });
    

    【讨论】:

    • 是的,我是这样想的,我同意你的观点,我试过了,但我对客户端有点困惑,你能不能帮我解释一下如何在前面实现这个-结尾。这是前端的代码。 useEffect(() => { axios.get(http://localhost:3007/comments/commentsCounter/${id}).then((res) => { setCommentsCounter(res.data.cmetsCounter); }); }, []);并像这样渲染: {t("view_cmets")} ({cmetsCounter})
    • @john,这又取决于您如何获取数据,但如果您根据获取请求调用获取 cmets,那么来自 SQL 的响应应该已经是一个将被发送的对象回到客户端。到达那里后,您只需执行 .length 即可获取 JSON 对象中的项目总数,或者如果它包含多个,则仅包含一个基于父 ID 的帖子响应过滤器
    • 非常感谢您的关注!我对 Mysql 有点陌生,这就是我对此感到困惑的原因。只要你能清除它或一个完整的例子,那就太好了:)
    【解决方案2】:

    如果没有看到完整的代码(DB 调用、select 语句的样子等),很难说......

    但是,通常如果您的数据库设置为说“posts”和“cmets”表,并且评论表有类似 id 和 parentID(“posts”表中父 POST 的 ID),那么您应该能够使用 javascript 或数据库查询本身相当容易地做到这一点

    如果您在数据库端执行此操作,您通常会在 select 语句中添加一个 COUNT,或者一旦您获得查询结果,您就可以对返回的对象执行“长度”以获得返回的总数。

    *** 编辑 ***

    正如@Pouya 所指出的,您可以通过他的帖子中所示的 SQL 查询来执行操作,这将根据选择计算响应的数量,这确实需要一个查询,但又不知道完整的流程这可能是也可能不是您要查找的内容,但会根据特定查询为您提供计数。

    现在,如果您说要返回一个包含所有回复的大型对象,并且只想获取特定子集的响应,您将需要考虑通过正确的键/值过滤您的返回对象

    类似

    let myArr = [{id:'123',name:'item1'},{id:'234',name:"item2"}, 
    {id:'123',name:"item3"}]
    
    //filter just id 123
    // filter syntax is [array].filter(variable => [key you want to filter on].includes("[value to filter on]")
    let newArray = myArr.filter(p => p.id.includes('123'));
    
    //our new array
    
    console.log(newArray)
    

    应该让你只是数组的一个子集,然后你就可以这样做

    let replyCount = newArray.length
    

    【讨论】:

    • 非常感谢您的友好回复,我将发布数据库的图片,您可以查看,是的,我正在使用 MYSQL DB,我有 2 个表(帖子)和(评论) .我只想在post部分下显示每个post的cmet总数。
    • 请再看一遍我编辑的问题!
    • @john,我已经更新了回复以添加一些额外的东西来尝试。
    • 我做的是这样的:-1 我声明了一个语句 const [cmetsCounter, setCommentsCounter] = useState([]);和:-2 像这样通过 axios 获取:useEffect(() => { axios.get(http://localhost:3007/comments/commentsCounter/${id}).then((res) => { setCommentsCounter(res.data.cmetsCounter); }); }, [] );然后渲染 {cmetsCounter.length} 但我得到了一个空数组。
    • 您可能希望首先从您的 get 请求中返回数据。所以 console.log res AND the res.data AND res.data.cmetsCounter 以确保您实际上得到了您想要的响应。也有一次(我个人不使用 axios,但确保类型是 JSON),因此您还需要确保响应是对象类型而不是字符串类型。也不确定 setCommentsCounter 函数做了什么,所以很难说
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多