mongoose / mongodb решают проблему со спамом как / в отличие от кнопки и обновлением - PullRequest
0 голосов
/ 28 апреля 2020

Поэтому, когда пользователь нажимает кнопку «Мне нравится / не нравится», обновления базы данных ведут себя странным образом. Например:

  • , если пользователь МЕДЛЕННО нажимает «нравится» и «не нравится», лайки поста обновляются нормально: у поста 0 лайков, если он не нравится, у поста 1 лайк, если нравится
  • если пользователь БЫСТРО нажимает кнопку «Нравится» и «В отличие от» несколько раз, а лайки поста обновляются странным образом: у поста есть 0 лайков, если он не понравился, и вдруг у него есть 2 лайка, когда он понравился.

Я считаю, что это может как-то связано с асинхронным характером того, как mon goose обновляет базу данных.

script. js:

$('.card-body').on('click', '#like-btn', function() {

    //unlike button is similar except that it requests /unlikePost
    $.get('/likePost', {username: username, postId: postId}, (data) => {});
}) 

Я думал об окончании вызова ajax вокруг timeout, но я не уверен, что это лучший способ.

вызовы базы данных:

likePost: function(postId, username) {
    database.updateOne(Post, {_id: postId}, {$inc: {numberOfLikes: 1}}, (flag) => {

    })
    database.updateOne(User, {username: username}, {$addToSet: {likedPosts: postId}}, (userFlag) => {
        console.log(userFlag)
    })
},

unlikePost: function(postId, username) {
    database.updateOne(Post, {_id: postId}, {$inc: {numberOfLikes: -1}}, (flag) => {

    })
    database.updateOne(User, {username: username}, {$pull: {likedPosts: postId}}, (userFlag) => {
        console.log(userFlag)
    })
},

1 Ответ

0 голосов
/ 28 апреля 2020

Самое простое решение - отключить кнопку в пользовательском интерфейсе при ее нажатии, затем выполнить обновление, а затем снова включить кнопку. Это заставит вашу систему вести себя правильно, когда ее используют обычные пользователи (они не смогут нажать на отключенную кнопку).

Чтобы система работала правильно, когда столкнулась с решительным злоумышленником , вы нужно отслеживать, кто проголосовал на стороне сервера, и разрешить только один голос на пользователя / IP / что угодно, запретить голосование без предварительного голосования и т. д. c. В этом сценарии злоумышленник может отправлять запросы API непосредственно в ваше приложение, и то, что вы делаете в веб-интерфейсе, не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...