如何从数据库中实时更新上票和下票数而不需要重定向?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从数据库中实时更新上票和下票数而不需要重定向?相关的知识,希望对你有一定的参考价值。

我在图片库上设置了上票和下票按钮,用户可以进行投票,但问题是不能实时更新,我需要通过服务器刷新页面来更新mongodb数据库中的投票数。

投票分数不显示在前端,当用户点击它时,需要刷新页面以更新每次用户投票的结果。

按钮。

<div class="message__votes" Title= "<%=photo.Title%>" data-id="<%=photo._id%>">
    <button class="btn btn-default message__vote " id="upvote" type="button"><i class="fa fa-check"></i></button>
    <!-- <button class="message__vote" id="upvote"></button> -->
    <div class="vote__counter"><%=photo.voteScore%></div>
    <button class="btn btn-default message__vote" id="downvote" type="button"><i class="fa fa-upload"></i><span class="bold"></span></button>
</div> 

这是我的ajax,从前端向服务器发送数据。 我的前端发送ID,其他按钮通过ajaxx请求点击到快递服务器的发布路径。

我的ajax发布方法。

$('body').on('click', '#upvote', event => {
    const id = event.target.parentElement.getAttribute('data-id');

    upvoteMessage(id);
})

$('body').on('click', '#downvote', event => {
    const id = event.target.parentElement.getAttribute('data-id');

    downvoteMessage(id);      
})

function upvoteMessage(id) {
    $.ajax({
        url: '/' + id + '/upvote',
        type: 'patch',
        contentType: 'application/json',
        headers: {
            authorization: `Bearer ${window.localStorage.token}`
        }
    })
    .done(res => {
        STORE.update(res.photo);
        renderPhotos();
    })
}

function downvoteMessage(id) {
    $.ajax({
        url: '/' + id + '/downvote',
        type: 'patch',
        contentType: 'application/json',
        headers: {
            authorization: `Bearer ${window.localStorage.token}`
        }
    })
    .done(res => {
        STORE.update(res.photo);
        renderPhotos();
    })
}

这些路由是将数据存储在mongoose数据库中的post路由。这些路由将票数存储到照片集的voteScore计数变量中。

我在服务器上的路由。


exports.postUpvote= (req, res) => {

    PhotoEntries
        .findById(req.params.id)
        .then(photos => {
            const alreadyUpvoted = photos.upvoted.includes(req.user.id);
            if (alreadyUpvoted) {
                photos.voteScore--;
                photos.downvoted.push(req.user.id);
                photos.save()
                    .then(photos => {
                        return res.status(200).json({photos});
                    })
            }
            const alreadyDownvoted = photos.downvoted.includes(req.user.id);
            if (alreadyDownvoted) {
                let _downvoted = photos.downvoted.filter(id => id !== req.user.id);
                photos.downvoted = _downvoted;
            }
            photos.voteScore++;
            photos.upvoted.push(req.user.id);
            photos.save()
                .then(photos => {

                    res.send({voteScore:photos.voteScore});
                    res.redirect("/")
                })
        })
        .catch(err => {
            res.status(500).json({error: err});
        })
}

exports.postDownvote = (req, res) => {

    PhotoEntries
        .findById(req.params.id)
        .then(photos => {
            const alreadyDownvoted = photos.downvoted.includes(req.user.id);
            if (alreadyDownvoted) {
                return res.status(400).json({error: 'cannot vote the same way twice'});
            }
            const alreadyUpvoted = photos.upvoted.includes(req.user.id);
            if (alreadyUpvoted) {
                let _upvoted = photos.upvoted.filter(id => id !== req.user.id);
                photos.upvoted = _upvoted;
            }
            photos.voteScore--;
            photos.downvoted.push(req.user.id);
            photos.save()
                .then(photos => {
                    return res.status(200).json({photos});
                })
        })
        .catch(err => {
            res.status(500).json({error: err});
        })
}

当用户点击上票或下票按钮时,它会自动从数据库中更新分数,而无需刷新页面。我的上票和下票是附加在照片集合模式上的,每张照片都有自己的上票和下票。

答案

你可以做一件事,比如当你从后台得到上票和下票的ajax调用响应时,你可以在API响应中发送上票和下票的总票数,然后你可以在 计票器.

以上是关于如何从数据库中实时更新上票和下票数而不需要重定向?的主要内容,如果未能解决你的问题,请参考以下文章

javascript FV-重定向 - 不登录上票

如何从 getStaticProps 返回重定向而不从 TypeScript 出错?

C# - 实时控制台输出重定向

从 MYSQL 表中更新值而不重新加载页面?

如何仅重定向子目录而不重定向内容?

当引导验证成功时,如何使用 $.post 提交表单而不进行页面重定向?